我有一个返回BLOB的DB过程。有人能告诉我如何操作BLOB吗?这有什么特定的API吗?
是否有特定的API ?
当然,JDBC API。
- 小道:JDBC™数据库访问
获取Blob
实例,就像获取结果集中的任何值一样。然后,您应该在此Blob
上使用get...
-和set...
方法。
这里基本上有两个选项:
-
使用字节数组:
- 通过
Blob.getBytes
获取包含数据的 - 操作字节数组
- 设置使用
Blob.setBytes
。
byte[]
- 通过
-
使用
InputStream
/OutputStream
:- 获取
InputStream
到Blob.getBinaryStream
- 按您认为合适的方式操作此流
- 使用
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
。
-
ResultSet.getBlob(index)
或 -
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();
}
}