JDBCのBLOBデータ型とは?データベースへの保存と読み取り方法を徹底解説
BLOB(バイナリラージオブジェクト)とは
BLOB(Binary Large Object)は、最大65535バイトの可変長データを格納できるバイナリ大規模オブジェクトです。
BLOBは、画像やその他の種類のファイルなど、大量のバイナリデータを保存するために使用されます。TEXT型として定義されたフィールドも同様に大量のデータを保持できますが、両者の違いは、保存されたデータに対するソートや比較の際に、BLOBでは大文字と小文字が区別されるのに対し、TEXTフィールドでは区別されないという点です。なお、BLOBおよびTEXT型では長さを指定する必要はありません。
BLOBをデータベースに保存する手順
JDBCプログラムを使用してBLOB型のデータをデータベースに保存するには、以下の手順に従います。
ステップ1:データベースに接続する
DriverManagerクラスのgetConnection()メソッドを使用してデータベースに接続します。
MySQLデータベースに接続するには、MySQLのURL「jdbc:mysql://localhost/sampleDB」(sampleDBはデータベース名)、ユーザー名、パスワードを引数としてgetConnection()メソッドに渡します。
String mysqlUrl = "jdbc:mysql://localhost/sampleDB"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
ステップ2:PreparedStatementを作成する
ConnectionインターフェースのprepareStatement()メソッドを使用して、PreparedStatementオブジェクトを作成します。このメソッドには、プレースホルダ(?)を含むINSERTクエリを引数として渡します。
PreparedStatement pstmt = con.prepareStatement("INSERT INTO MyTable VALUES(?, ?)");ステップ3:プレースホルダに値を設定する
PreparedStatementインターフェースのセッターメソッドを使用して、プレースホルダに値を設定します。カラムのデータ型に応じて適切なメソッドを選択してください。例えば、カラムがVARCHAR型の場合はsetString()メソッドを、INT型の場合はsetInt()メソッドを使用します。
BLOB型の場合は、setBinaryStream()またはsetBlob()メソッドを使用して値を設定できます。これらのメソッドには、パラメータインデックスを表す整数値と、InputStreamクラスのオブジェクトを引数として渡します。
pstmt.setString(1, "sample image");
//BLOB型の挿入
InputStream in = new FileInputStream("E:\\images\\cat.jpg");
pstmt.setBlob(2, in);ステップ4:ステートメントを実行する
PreparedStatementインターフェースのexecute()メソッドを使用して、作成したPreparedStatementオブジェクトを実行します。
データベースからBLOBを読み取る手順
ResultSetインターフェースのgetBlob()メソッドは、カラムのインデックスを表す整数値(またはカラム名を表す文字列)を受け取り、指定されたカラムの値をBlobオブジェクトとして返します。
while(rs.next()) {
rs.getString("Name");
rs.getString("Type");
Blob blob = rs.getBlob("Logo");
}BlobインターフェースのgetBytes()メソッドは、現在のBlobオブジェクトの内容を取得し、バイト配列として返します。
getBlob()メソッドでBLOBの内容をバイト配列に取得し、FileOutputStreamオブジェクトのwrite()メソッドを使えば、画像ファイルとして復元することができます。
byte byteArray[] = blob.getBytes(1,(int)blob.length());
FileOutputStream outPutStream = new FileOutputStream("path");
outPutStream.write(byteArray);サンプルプログラム
以下の例では、MySQLデータベースにBLOB型のカラムを持つテーブルを作成し、画像を挿入します。その後、データを取得してローカルファイルシステムに保存します。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class BlobExample {
public static void main(String args[]) throws Exception {
//ドライバの登録
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//接続の確立
String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
//テーブルの作成
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE SampleTable( Name VARCHAR(255), Image BLOB)");
System.out.println("Table Created");
//データの挿入
String query = "INSERT INTO SampleTable(Name,image) VALUES (?, ?)";
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setString(1, "sample image");
FileInputStream fin = new FileInputStream("E:\\images\\cat.jpg");
pstmt.setBlob(2, fin);
pstmt.execute();
//データの取得
ResultSet rs = stmt.executeQuery("select * from SampleTable");
int i = 1;
System.out.println("Contents of the table are: ");
while(rs.next()) {
System.out.println(rs.getString("Name"));
Blob blob = rs.getBlob("Image");
byte byteArray[] = blob.getBytes(1,(int)blob.length());
FileOutputStream outPutStream = new
FileOutputStream("E:\\images\\blob_output"+i+".jpg");
outPutStream.write(byteArray);
System.out.println("E:\\images\\blob_output"+i+".jpg");
System.out.println();
i++;
}
}
}実行結果
Connection established...... Table Created Contents of the table are: sample image E:\images\blob_output1.jpg
-
JDBCのResultSetとは?ResultSetオブジェクトからデータを取得する方法を徹底解説
JDBCにおけるResultSetインターフェースは、SQLクエリを実行した結果として生成される表形式(テーブル形式)のデータを表現するためのものです。ResultSetは現在の行を指し示す「カーソル」を持っており、初期状態では、このカーソルは最初の行の直前に位置しています。カーソルを移動して結果セットを走査するResultSetインターフェースが提供するnext()メソッドを使うと、現在のカーソル位置から次の行へとポインタを移動できます。このメソッドはboolean値を返し、次の行が存在すればtrue、現在位置以降にこれ以上の行がない場合はfalseを返します。そのため、whileループの中
-
Windows Serverとは?通常のWindowsとの違いを8つのポイントで徹底解説
Windows OSはオペレーティングシステム市場で大きなシェアを占めており、世界で最も人気のあるOSの一つとされています。MicrosoftはWindowsを大きく2つの種類で提供しています。 デスクトップ向けWindows Windows Server Windows Server 2022は、Windows 11に対応する最新のサーバー向けエディションです。両者は目的がまったく異なるため、それぞれの役割を正しく理解することが重要です。本記事では、Windows Serverとは何か、そして通常のWindowsとどこが違うのかを詳しく解説します。 WindowsとWindows Ser