Как манипулировать BLOB в Java?

У меня есть процедура DB, которая возвращает BLOB. Кто-нибудь может сказать мне, как манипулировать каплей? Есть ли какой-либо конкретный API для этого?

4 ответов


есть ли какой-либо конкретный API для этого ?

конечно, API JDBC.


Вы достать Blob экземпляр так же, как вы получаете любое значение из результирующего набора. Затем вы должны использовать get... и set... методы на этот Blob.

здесь у вас в основном есть два опции:

  • работа с байтовым массивом:

    1. найти byte[], содержащие данные через Blob.getBytes
    2. манипулировать этим массивом байтов
    3. установите его обратно с помощью Blob.setBytes.


  • работы с InputStream / OutputStream:

    1. держите Ан InputStream через Blob.getBinaryStream
    2. управлять этим потоком, как вы считаете нужным
    3. использовать 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.

  1. ResultSet.getBlob(index) или
  2. 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