我有一个返回BLOB的DB过程。谁能告诉我如何操纵BLOB?是否有任何特定的API?
答案 0 :(得分:14)
是否有针对此的特定API?
当然,JDBC API。
您可以抓住Blob
实例,就像从结果集中获取任何值一样。然后,您应该使用此get...
上的set...
- 和Blob
方法。
这里你基本上有两个选择:
使用字节数组:
Blob.getBytes
byte[]
Blob.setBytes
将其设置回来。使用InputStream
/ OutputStream
:
InputStream
到Blob.getBinaryStream
Blob.setBinaryStream
。
另一种方法是首先跳过弄乱Blob
,而是直接通过ResultSet
- 接口使用第二种方法(使用流)。
答案 1 :(得分:5)
取决于哪种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;
}
}
答案 2 :(得分:2)
使用Simple Java JDBC Api,您可以从java.sql.Blob
获得ResultSet
。
ResultSet.getBlob(index)
或ResultSet.getBlob(String columnName)
。两者都返回Blob
。
获得Blob
后,您可以从Blob.getBytes()
方法返回byte[]
或使用setBytes()
方法进行设置。
更新:看到某些数据库驱动程序供应商不支持Blob
,您可以使用ResultSet.getBinaryStream()
。
答案 3 :(得分:0)
您可以使用javax.sql.rowset.serial.SerialBlob。
我在我的SpringBoot&amp;中使用它像这样的Angular4应用程序:
SerialBlob serialBlob = new SerialBlob(byte[])