我是java和mysql的新手,我正在尝试从mysql数据库中检索多个(很多!)blob图像。
我需要某种循环查询来完成所有图像。
我从一个教程(http://www.roseindia.net/java/java-get-example/get-blob.shtml)开始,这对我很有用。 - 请记住,我希望将照片直接送到我的电脑。
你们有没有关于如何扩展现有代码的建议,以便检索不是一个而是多个图像?
这是我正在使用的代码:
class GetBlob {
FileOutputStream image;
Connection con = null;
PreparedStatement pstmt = null;
Statement stmt = null;
ResultSet res = null;
StringBuffer query = null;
String driverName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/";;
String dbName = "portal";
String userName = "root";
String password = "xxxx";
public GetBlob() {
try {
Class.forName(driverName);
con = DriverManager.getConnection(url + dbName, userName, password);
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from pictures where id='1'");
if (rs.next()) {
Blob test = rs.getBlob("picture");
InputStream x = test.getBinaryStream();
int size = x.available();
OutputStream out = new FileOutputStream("/Users/User/Desktop/anu2.jpg");
byte b[] = new byte[size];
x.read(b);
out.write(b);
}
} catch (Exception e) {
System.out.println("Exception :" + e);
} finally {
try {
stmt.close();
con.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
public static void main(String args[]) throws IOException {
GetBlob blob = new GetBlob();
}
}
答案 0 :(得分:0)
<强>提示强>
<强>零强>
int
不应介于两个'id'
<强>第一强> 您可以在查询和GetResult中进行一些更改:
您的查询应如下所示:
"select * from pictures" -- without where because if the id is unique you will get only one
或者您可以使用 IN
:
"select * from pictures where id IN (id1, id2, id3, ...)"
<强>第二强>
要获得多个结果,您必须改为List
。
而不是if(rs.next())
,您必须使用while(rs.next())
<强>第三强> 如果要返回值,则必须使用方法,而不是调用构造函数。
public static List<Images> getImages(){
...
}
<强>第四强> 要避免任何类型的语法错误或SQL注入,您必须改为使用PreparedStatement。
希望这条指令可以帮助你,并给你一个想法,祝你好运。
答案 1 :(得分:0)
执行多个查询可能很麻烦且效率不高。
您可以使用PreparedStatement
并在查询中指定IN
子句,但无法设置参数列表。
一种简单而有效的替代方法是使用与输入列表id的大小一样多?
动态创建查询。然后执行查询并迭代ResultSet
并应用您用于从ResultSet
获取blob的处理单元。
未经测试的示例代码:
List<Integer> ids = ...; // the ids you want to use for your query
String sql= createQuery(ids);
PreparedStatement preparedStatement = dbConnection.prepareStatement(sql);
for (int i=0; i< ids.size(); i++){
int id = ids.get(i);
preparedStatement.setInt(i+1, id);
}
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
// your actual code
Blob test = rs.getBlob("picture");
InputStream x = test.getBinaryStream();
int size = x.available();
OutputStream out = new FileOutputStream("/Users/User/Desktop/anu2.jpg");
byte b[] = new byte[size];
x.read(b);
out.write(b);
}
private String createQuery(List<Integer> ids){
String query = "select * from pictures where id IN(";
for (int i=0; i< ids.size(); i++){
if (i>0){
query += ",";
}
query += "?";
}
query += ")";
return query;
}