H2のBLOBデータをJDBCで扱う

この記事では、H2 Database Engineを使用して、BLOBデータの登録、取得、またJDBCでのBLOBデータへのアクセス方法を解説します。

ソフトウェアのバージョンは次の通り。Windows 10環境で確認しています。

Java
9.0.4
H2 Database Engine
1.4.197

H2の準備

H2は次のサイト

H2 Database Engine
H2 is free SQL database written in Java

から「All Platforms」のzipファイルをダウンロードします。ダウンロードしたファイルを展開し任意のフォルダに置きます(今回は、C:\tempに置きます)。

展開したフォルダの中にある、binフォルダの中のh2w.batをダブルクリックで実行します。そうするとブラウザが起動します。

開いたブラウザの画面で、「保存済設定」の「Generic H2 (Server)」を選択します。その後、「接続」ボタンを押すとH2に接続できます。

H2に接続すると、そこからSQLを発行することができます。

管理画面でのBLOB操作

テスト用テーブルの作成

BLOBを格納するテーブルを適当に作ります。キー項目がないとアクセスしにくいので、キー項目とBLOBの項目の2つだけのテーブルとします。発行するSQLは次のようになります。

CREATE TABLE blob_table(
  key INT PRIMARY KEY,
  image BLOB
)

SQLの実行は次のように行います。

BLOBに画像ファイルのINSERT

適当な画像ファイルをC:\temp\test.pngに置きます。このファイルをBLOBの項目にINSERTします。実行するINSERT文は次のようになります。

INSERT INTO blob_table VALUES(1, FILE_READ('C:\temp\test.png'))

BLOBからファイルの取り出し

画像をBlobにINSERTしましたが、ブラウザの管理画面では内容を確認することができません(16進数ではみられますが。。)。そこで、SELECT文で画像をファイルとして保存します。

SELECT FILE_WRITE(image, 'C:\temp\output.png')
FROM blob_table
WHERE key = 1

JDBCでのBLOB操作

最初にJDBCドライバをクラスパスに追加します。Eclipse上であれば次の手順で行います。

JDBCドライバは、H2を展開したフォルダの中の、bin\h2-1.4.197.jarです。このファイルをEclipseにコピーして、「右クリック」→「Buil Path」→「Add to Build Path」を選択します。

JDBCでのBLOBデータのINSERT

データのINSERTは次のように行います。keyが1のデータを登録しますので、該当のデータがあれば事前に削除してから実行してください。

package h2;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Insert {
    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", null);
                PreparedStatement stmt = conn.prepareStatement("INSERT INTO blob_table VALUES(?, ?)");
                InputStream is = Files.newInputStream(Paths.get("C:\\temp\\test.png"))) {
            stmt.setInt(1, 1);
            stmt.setBlob(2, is);
            stmt.executeUpdate();
        } catch (SQLException | IOException e) {
            e.printStackTrace();
        }
    }
}

通常のJDBCでのINSERT処理とほぼ同等ですが、BLOBには格納するファイルのInputStreamを渡します。

JDBCでのBLOBデータのSELECT

keyが1のデータをSELECTで取得する例を示しますので、事前にデータをINSERTしておいてください。具体的なSELECTのコードは次のとおりです。

package h2;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Select {
    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", null);
                PreparedStatement stmt = conn.prepareStatement("SELECT image FROM blob_table WHERE key = ?")) {
            stmt.setInt(1, 1);
            try (ResultSet rs = stmt.executeQuery()) {
                if (rs.next()) {
                    Blob blob = rs.getBlob(1);
                    try (InputStream is = blob.getBinaryStream()) {
                        Files.copy(is, Paths.get("C:\\temp\\output.png"));
                    }
                }
            }
        } catch (SQLException | IOException e) {
            e.printStackTrace();
        }
    }
}

Blobデータは、ResultSet#getBlobを使用します。getBlobで取得したBlobオブジェクトからBlobデータのInputStreamが取得できますので、それを利用してデータを処理します。今回は、ファイルとして保存しています。

コメント