如何在Java中操作BLOB

  • 本文关键字:操作 BLOB Java java blob
  • 更新时间 :
  • 英文 :


我有一个返回BLOB的DB过程。有人能告诉我如何操作BLOB吗?这有什么特定的API吗?

是否有特定的API ?

当然,JDBC API。

  • 小道:JDBC™数据库访问

获取Blob实例,就像获取结果集中的任何值一样。然后,您应该在此Blob上使用get... -和set...方法。

这里基本上有两个选项:

  • 使用字节数组:

    1. 通过Blob.getBytes
    2. 获取包含数据的byte[]
    3. 操作字节数组
    4. 设置使用Blob.setBytes


  • 使用InputStream/OutputStream:

    1. 获取InputStreamBlob.getBinaryStream
    2. 按您认为合适的方式操作此流
    3. 使用Blob.setBinaryStream

另一种方法是首先跳过Blob,而是直接通过ResultSet接口使用第二种方法(使用流)。

这取决于哪种blob包含(图像,视频)和它的扩展。我编写了一个简单的程序来从DB检索图像并在JSP页面中显示它。希望能有所帮助。

JSP页面

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body>                            
    <image src="blobAction"/> 
</body>

Servlet页

byte[] imgData = blobDao.getInstance().getPhoto();
        response.setContentType("image/gif");
        OutputStream o = response.getOutputStream();
        o.write(imgData);
        o.flush();
        o.close();

呼叫程序

public byte[] getPhoto() {
    byte[] imgData = null;
    Blob img = null;
    ResultSet rs = null;
    Statement stmt = null;
    try {
        conn = getConnection();
        String sqlQ = "SELECT CONTENT_FILE FROM CONTENT where id = 'something';
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sqlQ);
        while (rs.next()) {
            img = rs.getBlob("CONTENT_FILE");
            imgData = img.getBytes(1, (int) img.length());
        }
        rs.close();
        stmt.close();
        conn.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {           
        return imgData;
    }
}

使用简单的Java JDBC Api,您可以从ResultSet返回java.sql.Blob

  1. ResultSet.getBlob(index)
  2. ResultSet.getBlob(String columnName) .

都返回一个Blob

一旦您获得了Blob,您可以从Blob.getBytes()方法或使用setBytes()方法获得byte[]

更新:看到一些数据库驱动供应商不支持Blob,你可以使用ResultSet.getBinaryStream()

可以使用javax.sql.rowset.serial.SerialBlob.

我在我的SpringBoot &Angular4应用程序如下:

  • 从Angular4应用程序获取Base64String
  • 解码Base64String为字节[]
  • 创建SerialBlob: SerialBlob serialBlob = new SerialBlob(byte[])
  • 使用JpaRepository
  • 将其存储在数据库中

示例

public void Insert(Object obj){
        try {
            ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
            ObjectOutputStream oos=new ObjectOutputStream(byteArray);
            oos.writeObject(obj);
            PreparedStatement ps= conn1.prepareStatement("insert into vehiculos values(?)");    
            ps.setBytes(1, byteArray.toByteArray());  
            ps.execute();
            ps.close();
        } catch (SQLException ex) {
            System.out.println("ERROR:al hacer un Insert");   
            ex.printStackTrace();
        } catch (IOException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void ShowData(){
        try {
            Statement stmt = conn1.createStatement();
            String query = "SELECT * FROM vehiculos";
            ResultSet rs = stmt.executeQuery(query);
            Object obj;
            while(rs.next()){
                //Coche c = (Coche)rs.getBlob("coches");
                Blob blob = rs.getBlob("coches");
                ObjectInputStream ois = new ObjectInputStream(blob.getBinaryStream());
                obj = ois.readObject();
                System.out.println(obj.toString());
                System.out.println("");
                /*Blob blob = rs.getBlob("coches");
                byte[] data = blob.getBytes(1, (int)blob.length());*/
                
            }
            rs.close();
            stmt.close();
        
      } catch (SQLException ex) {
            System.out.println("ERROR:al consultar");
            ex.printStackTrace();
      } catch (IOException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void cerrar_Conexion (){
       
        try {  
        conn1.close();
      } catch (SQLException ex) {
            System.out.println("ERROR:al cerrar la conexión");
            ex.printStackTrace();
      }
    }

最新更新