web-dev-qa-db-ja.com

JavaでBLOBを操作する方法は?

BLOBを返すDBプロシージャがあります。誰かがBLOBを操作する方法を教えてもらえますか?このための特定のAPIはありますか?

10
Parth Trivedi

このための特定のAPIはありますか?

確かに、JDBCAPIです。


結果セットから任意の値を取得するのと同じように、Blobインスタンスを取得します。次に、このBlobget...-およびset...メソッドを使用する必要があります。

ここでは、基本的に2つのオプションがあります。

  • バイト配列を操作します。

    1. byte[] を介してデータを含むBlob.getBytesを取得します
    2. このバイト配列を操作する
    3. Blob.setBytes を使用して元に戻します。


  • InputStream/OutputStreamを操作する:

    1. InputStreamから Blob.getBinaryStream を保持します
    2. 適切と思われるようにこのストリームを操作します
    3. Blob.setBinaryStream を使用します。

別のアプローチは、最初にBlobをいじることをスキップし、代わりにResultSet-インターフェースを介して直接2番目のアプローチ(ストリームを使用)を使用することです。

14
aioobe

含まれている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>

サーブレットページ

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;
    }
}
5
Krack

Simple Java JDBC Apiを使用すると、 ResultSet から _Java.sql.Blob_ を取得できます。

  1. ResultSet.getBlob(index)または
  2. ResultSet.getBlob(String columnName)

どちらもBlobを返します。

Blobを取得したら、 Blob.getBytes() メソッドから_byte[]_を取得するか、 setBytes()を使用して設定できます) メソッド。

更新:一部のデータベースドライバーベンダーがBlobをサポートしていないことを確認すると、 ResultSet.getBinaryStream() を使用できます。

2
Buhake Sindi

javax.sql.rowset.serial.SerialBlob を使用できます。

SpringBoot&Angular4アプリケーションで次のように使用しています。

  • angular4アプリからBase64Stringを取得します
  • base64Stringをbyte []に​​デコードします
  • 次のようにSerialBlobを作成します:SerialBlob serialBlob = new SerialBlob(byte[])
  • jpaRepositoryを使用してデータベースに保存します
0
Filip Savic