Как манипулировать BLOB в Java?
У меня есть процедура DB, которая возвращает BLOB. Кто-нибудь может сказать мне, как манипулировать каплей? Есть ли какой-либо конкретный API для этого?
4 ответов
есть ли какой-либо конкретный API для этого ?
конечно, API JDBC.
Вы достать Blob
экземпляр так же, как вы получаете любое значение из результирующего набора. Затем вы должны использовать get...
и set...
методы на этот Blob
.
здесь у вас в основном есть два опции:
-
работа с байтовым массивом:
- найти
byte[]
, содержащие данные черезBlob.getBytes
- манипулировать этим массивом байтов
- установите его обратно с помощью
Blob.setBytes
.
- найти
-
работы с
InputStream
/OutputStream
:- держите Ан
InputStream
черезBlob.getBinaryStream
- управлять этим потоком, как вы считаете нужным
- использовать
Blob.setBinaryStream
.
- держите Ан
альтернативный подход-пропустить возню с Blob
во-первых, и вместо этого используйте второй подход (с потоками) непосредственно через ResultSet
-интерфейс.
Это зависит от того, какой blob содержит (изображение, видео), и это расширение. Я написал простую программу для извлечения изображения из БД и отображения его на странице 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>
Сервлет Страницы
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 вы можете получить java.sql.Blob
вернулся из ResultSet
.
-
ResultSet.getBlob(index)
или -
ResultSet.getBlob(String columnName)
.
как возвращает Blob
.
как только вы получите Blob
, вы можете получить byte[]
вернулся из Blob.getBytes()
метод или набор с помощью setBytes()
метод.
Update: видя, что некоторые поставщики драйверов базы данных не поддерживают Blob
, вы можете использовать ResultSet.getBinaryStream()
.
можно использовать javax.язык SQL.набор строк.серийный.SerialBlob.
Я использую его в своем приложении SpringBoot & Angular4 следующим образом:
- получить Base64String из приложения Angular4
- декодировать Base64String в байт[]
- создайте SerialBlob следующим образом:
SerialBlob serialBlob = new SerialBlob(byte[])
- сохраните его в базе данных с помощью JpaRepository