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

JDBCのClobデータ型とは?データベースへの保存と読み取り方法を解説


CLOBは「Character Large Object(キャラクタ・ラージ・オブジェクト)」の略称で、SQLにおけるClobは組み込みデータ型の一つです。大量のテキストデータを格納するために使用され、このデータ型を使えば最大2,147,483,647文字までのデータを保存できます。

JDBC APIのjava.sql.Clobインターフェースが、このCLOBデータ型を表現します。JDBCにおけるClobオブジェクトはSQLロケーター(locator)を用いて実装されているため、実際にはCLOBのデータ本体ではなく、SQL CLOBを指す論理ポインターを保持している点に注意してください。

MySQLデータベースでは、このデータ型を次の4つの型でサポートしています。

  • TINYTEXT:最大28−1(255)文字のCLOB型

  • TEXT:最大216−1(65,535)文字のCLOB型

  • MEDIUMTEXT:最大224−1(16,777,215)文字のCLOB型

  • LONGTEXT:最大232−1(4,294,967,295)文字のCLOB型

Clobデータ型をデータベースのテーブルに保存する

JDBCプログラムを使ってClobデータ型をデータベースに保存するには、以下の手順に従います。

ステップ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 Technologies(Name,
Type, Article ) VALUES (?, ?, ?)");

ステップ3:プレースホルダーに値を設定する

PreparedStatementインターフェースのセッターメソッドを使用して、プレースホルダーに値を設定します。カラムのデータ型に応じて適切なメソッドを選択してください。たとえば、カラムがVARCHAR型ならsetString()メソッド、INT型ならsetInt()メソッドを使用します。

Clob型の場合は、setCharacterStream()またはsetClob()メソッドを使って値を設定できます。これらのメソッドには、パラメーターのインデックスを表す整数と、Readerクラスのオブジェクトを引数として渡します。

pstmt.setString(1, "JavaFX");
pstmt.setString(2, "Java Library");
FileReader reader = new FileReader("E:\\images\\javafx.txt");
pstmt.setClob(3, reader);
pstmt.execute();

ステップ4:ステートメントを実行する

PreparedStatementインターフェースのexecute()メソッドを使用して、作成したPreparedStatementオブジェクトを実行します。

データベースからClobを取得する

ResultSetインターフェースのgetClob()メソッドは、カラムのインデックスを表す整数(またはカラム名を表す文字列)を受け取り、指定されたカラムの値を取得してClobオブジェクトとして返します。

while(rs.next()) {
    System.out.println(rs.getString("Name"));
    System.out.println(rs.getString("Type"));
    Clob clob = rs.getClob("Article");
}

ClobインターフェースのgetCharacterStream()メソッドは、現在のClobオブジェクトの内容を取得し、Readerオブジェクトとして返します。

getClob()メソッドでClobの内容をReaderオブジェクトとして取得すれば、その内容を読み込みながらテキストファイルに書き出すことができます。

Reader r = clob.getCharacterStream();
FileWriter writer = new FileWriter("E:\\Data\\clob_output.txt");
int i;
while ((i = r.read()) != -1) {
    writer.write(i);
}
writer.close();

サンプルプログラム

以下の例では、MySQLデータベースにClob型(LONGTEXT)のカラムを持つテーブルを作成し、ファイルから大きなテキストデータを挿入します。その後、データを取り出して別のテキストファイルとして保存します。

import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class ClobExample {
    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 Technologies( Name VARCHAR(255), Type VARCHAR(255), Article LONGTEXT)");
        System.out.println("Table Created......");

        // データの挿入
        String query = "INSERT INTO Technologies(Name, Type, Article ) VALUES (?, ?, ?)";
        PreparedStatement pstmt = con.prepareStatement(query);
        pstmt.setString(1, "JavaFX");
        pstmt.setString(2, "Java Library");
        FileReader reader = new FileReader("E:\\images\\javafx.txt");
        pstmt.setClob(3, reader);
        pstmt.execute();
        pstmt.setString(1, "CoffeeScript");
        pstmt.setString(2, "Scripting Language");
        reader = new FileReader("E:\\images\\coffeescript.txt");
        pstmt.setClob(3, reader);
        pstmt.execute();
        pstmt.setString(1, "Cassandra");
        pstmt.setString(2, "NoSQL Database");
        reader = new FileReader("E:\\images\\cassandra.txt");
        pstmt.setClob(3, reader);
        pstmt.execute();

        // データの取得
        ResultSet rs = stmt.executeQuery("select * from Technologies");
        int j = 0;
        System.out.println("Contents of the table are: ");
        while(rs.next()) {
            System.out.println(rs.getString("Name"));
            Clob clob = rs.getClob("Article");
            Reader r = clob.getCharacterStream();
            String filePath = "E:\\Data\\clob_output"+j+".txt";
            FileWriter writer = new FileWriter(filePath);
            int i;
            while ((i=r.read())!=-1) {
                writer.write(i);
            }
            writer.close();
            System.out.println(filePath);
            j++;
        }
    }
}

実行結果

Connection established......
Table Created......
Contents of the table are:
JavaFX
Java Library
E:\images\clob_output1.txt
CoffeeScript
Scripting Language
E:\images\clob_output2.txt
Cassandra
NoSQL Database
E:\images\clob_output3.txt

まとめ

Clob型は、記事本文や長文ドキュメントなど、通常のVARCHARでは扱いきれない大量のテキストをデータベースで管理するための重要なデータ型です。JDBCではsetClob()/setCharacterStream()で保存し、getClob()とgetCharacterStream()で取得するという流れを押さえておけば、実務でもスムーズに活用できます。なお、現在のMySQL Connector/J(8.x以降)では、ドライバークラスとしてcom.mysql.cj.jdbc.Driverを使用する点にも留意してください。

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

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

  2. AirDropとは?iPhone・Mac間でファイルを共有する方法を徹底解説

    AirDropとは? 今すぐ、近くにあるMac・iPhone・iPadにファイルを送信できます。 テクノロジーの進化とともに、古いものは新しいものへと置き換えられていきます。その流れの中で、長年親しまれてきたメールもAirDropに取って代わりつつあります。意外に思われるかもしれませんが、AirDropは面倒なメールよりもはるかに優れたコミュニケーション手段なのです。 AirDropを使えば、暗号化された接続を通じて、近くにあるMacやiOSデバイス間でワイヤレスにファイルを共有できます。 何より嬉しいのは、面倒な初期設定なしですぐにファイル共有を始められる点です。デバイスが同じネットワーク