Java - 如何从MySQL中检索多个blob图像

时间:2017-04-11 11:31:24

标签: java mysql jdbc

我是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();
   }
}

2 个答案:

答案 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;
}