MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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
  1. JDBCのResultSetとは?ResultSetオブジェクトからデータを取得する方法を徹底解説

    JDBCにおけるResultSetインターフェースは、SQLクエリを実行した結果として生成される表形式(テーブル形式)のデータを表現するためのものです。ResultSetは現在の行を指し示す「カーソル」を持っており、初期状態では、このカーソルは最初の行の直前に位置しています。カーソルを移動して結果セットを走査するResultSetインターフェースが提供するnext()メソッドを使うと、現在のカーソル位置から次の行へとポインタを移動できます。このメソッドはboolean値を返し、次の行が存在すればtrue、現在位置以降にこれ以上の行がない場合はfalseを返します。そのため、whileループの中

  2. Windows Serverとは?通常のWindowsとの違いを8つのポイントで徹底解説

    Windows OSはオペレーティングシステム市場で大きなシェアを占めており、世界で最も人気のあるOSの一つとされています。MicrosoftはWindowsを大きく2つの種類で提供しています。 デスクトップ向けWindows Windows Server Windows Server 2022は、Windows 11に対応する最新のサーバー向けエディションです。両者は目的がまったく異なるため、それぞれの役割を正しく理解することが重要です。本記事では、Windows Serverとは何か、そして通常のWindowsとどこが違うのかを詳しく解説します。 WindowsとWindows Ser