Spring Boot DB連携

Spring Bootで、OracleのテーブルにBLOB,CLOBのカラムを含む場合のOracle接続を実装してみた

Oracleのデータ型に、大量のデータやバイナリデータを格納できる「BLOB」「CLOB」がある。「BLOB」にはバイナリデータ、「CLOB」にはテキストデータを格納できる。

OracleテーブルとJavaオブジェクトのデータ型の関連付けを行うものが「TypeHandler」である。MyBatis3.4以降のバージョンでは、「BLOB」と「java.io.InputStream」または「byte[]」が、「CLOB」と「java.lang.String」または「java.io.Reader」を関連付けする「TypeHandler」をサポートしている。

今回は、Spring Bootのmybatisを利用して、「BLOB」「CLOB」を含むテーブルへのデータ追加・データ参照を行ってみたので、そのサンプルプログラムを共有する。
ここでは、エンティティクラスで「BLOB」型データを「java.io.InputStream」で、「CLOB」型データを「java.lang.String」で定義している。

前提条件

以下の記事の「Oracle JDBC接続用jarの配置」までの処理が完了していること。

Spring BootでOracle接続処理を実装してみたSpring BootのWEBアプリケーションを開発する際、なんらかのデータベースにアクセスすることが多いが、SpringのJPAライブ...

やってみたこと

  1. BLOB,CLOBを含むテーブルの作成
  2. 利用するファイルの配置
  3. サンプルプログラムの作成
  4. サンプルプログラムの実行結果

 

BLOB,CLOBを含むテーブルの作成

今回作成するサンプルプログラムがアクセスするテーブル「file_data」を作成した。実行したSQLは以下の通り。

上記SQLを実行した結果は下図の通り。
file_dataテーブルのdesc

利用するファイルの配置

今回作成するサンプルプログラム内でアクセスするファイル「テスト.txt」を作成した。そのファイルの中身は以下の通り。
アクセスするファイル1
アクセスするファイル2

サンプルプログラムの作成

今回作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成

「build.gradle」の内容は以下の通りで、lombokとmybatisの定義を入れている。

また、「application.properties」には以下のように、DB接続定義とSQLログ出力定義を追加している。



エンティティクラス「FileData.java」は以下の通りで、「BLOB」型データを「java.io.InputStream」で、「CLOB」型データを「java.lang.String」で定義している。
さらに、直列化可能にするために、Serializableインタフェースを継承し、シリアルバージョンIDを設定している。

なお、Serializableについては、以下のページが参考になる。
https://qiita.com/NBT/items/9f76c9fd1c7a90506658

また、「file_data」テーブルとアクセスするMapperクラスは以下の通りで、VARCHAR2等他のデータ型の場合と同等の記載となっている。

さらに、FileDataMapperクラスのメソッドを呼び出すコントローラクラスの定義は、以下の通りとなる。InputStreamデータは、下記getFileObjDataメソッドで記載した通り、BufferedReaderクラスのreadLineメソッドを利用して取得できる。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-oracle-lob/demo

サンプルプログラムの実行結果

Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした場合、以下の画面が表示される。
画面表示

このときのコンソールログは以下の通りで、SQLログが出力されていることや、取得データの内容が確認できる。
コンソールログ

また、実行後の「file_data」テーブルのデータの内容は以下の通り。なお、「UTL_RAW.CAST_TO_VARCHAR2」を利用すると、BLOBのデータをテキストで表示できる。

実行後のfile_dataデータ1

実行後のfile_dataデータ2

要点まとめ

  • Oracleのデータ型に、大量のデータやバイナリデータを格納できる「BLOB」「CLOB」がある。「BLOB」にはバイナリデータ、「CLOB」にはテキストデータを格納できる。
  • Javaのエンティティクラスでは、「BLOB」型データを「java.io.InputStream」で、「CLOB」型データを「java.lang.String」で定義すれよい。