JDBCは、Javaを使ってリレーショナルデータベースを利用するためのAPIです。
JDBCを使ったプログラミングの基本パターンは、次の通りです。
では、サンプルを見てみましょう。このサンプルは、次のようなテーブルから、titleに"Java"という文字が含まれている本を検索して、タイトルを出力するプログラムです。
create table books (
    ndc           varchar(10),
    tyosya_hyouji varchar(2),
    id            int,
    title         varchar(50),
    author        varchar(50),
    publisher     varchar(30),
    constraint pk_books primary key(id)
);
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCTest {
    public static void main(String args[]) {
        try {
            // (1) データベースとの接続の確立
            Class.forName("org.hsqldb.jdbcDriver");
            String url = "jdbc:hsqldb:hsql://localhost";
            Connection con = DriverManager.getConnection(url, "sa", "");
            // (2) SQLの実行
            String selectStatement =
                "select title " +
                "from books where title like ?";
            PreparedStatement prepStmt =
                con.prepareStatement(selectStatement);
            prepStmt.setString(1, "%Java%");
            ResultSet rs = prepStmt.executeQuery();
            // (3) SQLの実行結果の処理
            while (rs.next()) {
                String title = rs.getString("title");
                System.out.println(title);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
まず最初のステップは、データベースとの接続を確立し、Connectionオブジェクトを得ることです。Connectionオブジェクトを取得する方法はいくつかあります。ここでは、最も一般的である、JDBCドライバをロードする方法について解説します。
まず、JDBCドライバを利用する例です。JDBCドライバとは、データベース管理システム(DBMS)に固有の処理をまとめたものです。JDBCドライバもJavaで書かれており、通常はjarファイルにまとめられています。
 // (1) データベースとの接続の確立
 Class.forName("org.hsqldb.jdbcDriver");
 String url = "jdbc:hsqldb:hsql://localhost";
 Connection con = DriverManager.getConnection(url, "sa", "");
この例では、HSQLDBを使用しています。
1行目で、HSQLDB用のJDBCドライバをロードしています。2行目で、データベースのありかを示すURLを指定します。URLは、次のような構造になっています。
jdbc:サブプロトコル:サブネーム
この例では、サブプロトコルが"hsqldb"で、サブネームが"hsql://localhost"になっています。
3行目で、データベースにアクセスするために必要なユーザ名・パスワードとURLを指定して、Connectionオブジェクトを取得しています。ここでは、ユーザ名"sa"で、パスワードは空になっています。
Connectionオブジェクトを取得したら、Statementを使ってSQLを実行します。
// (2) SQLの実行 String selectStatement = "select title from books"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(selectStatement);
Connectionオブジェクトから、Statementオブジェクトを生成します。Statementは、SQL文をデータベースに送るための入れ物のような役割を果たします。Statement#executeQueryメソッドによって、データベースにSQL文を送ります。
PreparedStatementはStatementを継承したものです。
サンプルを見てみましょう。
        String insertStatement =
            "insert into books values ( ? , ? , ? , ? , ? , ? )";
        PreparedStatement prepStmt = 
            con.prepareStatement(insertStatement);
        prepStmt.setString(1, ndc);
        prepStmt.setString(2, tyosya_hyouji);
        prepStmt.setString(3, id);
        prepStmt.setString(4, title);
        prepStmt.setString(5, author);
        prepStmt.setString(6, publisher);
        int result = prepStmt.executeUpdate();
        prepStmt.close();
Statementとの違いは、大きく分けて2つあります。
1つめは、SQL文が渡されるタイミングです。StatementではexecuteQueryメソッドを実行するときにSQL文が渡されます。それに対して、PreparedStatementではオブジェクトが生成されるときにSQL文が渡されます。PreparedStatementでは、SQL文はプリコンパイルされ、データベースで高速に処理されます。
もう1つの違いは、渡されるSQL文です。このサンプルでは、
"insert into books values ( ? , ? , ? , ? , ? , ? )";
というように、クエスチョンマークが6つ並んでいます。これは、SQLの文法にはない形です。このクエスチョンマークの部分には、PreparedStatement#setXXXというスタイルのメソッドを使って、データを設定します。例えば、PreparedStatement#setStringというメソッドは、クエスチョンマークの部分に文字列型のデータを挿入します。このメソッドには2つの引数があり、はじめの引数にはクエスチョンマークの順番を与え、2つめの引数には挿入したいデータを与えます。
prepStmt.setString(3, id);
この部分は、3番目のクエスチョンマークにidというString型のデータを与えることを意味します。
StatementよりもPreparedStatementを利用することで、より柔軟なプログラムを作れます。
StatementやPreparedStatementでは、SQLのselect文を実行するとき、executeQueryメソッドを使います。検索結果として、ResultSetが返されます。
ResultSet rs = stmt.executeQuery(selectStatement);
また、insert, update, deleteのような、データベースの更新を行う処理には、executeUpdateメソッドを使います。更新された行数が返されます。
int result = prepStmt.executeUpdate();
SQLのselect文による検索結果は、ResultSetオブジェクトで返されます。
		// (3) SQLの実行結果の処理
		while (rs.next()) {
			String title = rs.getString("title");
			System.out.println(title);
		}
ResultSetには、複数の行のデータが含まれています。rs.next()メソッドの繰り返しによって、次々と行を処理していきます。
        String title = rs.getString("title");
この部分では、1行分の検索結果のうち、"title"という項目のデータを、String型として取り出しています。
JDBCを使ったプログラムでは、JDBCドライバを読み込んでいます。そのため、JDBCドライバがある場所を指定しなければ、プログラムのコンパイルも実行もできません。そこで、JDBCドライバがまとめられているjarファイルの場所を、「クラスパス」で指定します。
HSQLDBをインストールしているフォルダをHSQLDB_HOMEという環境変数に設定しています。
最初に、コンパイルの方法です。
D:\Home>javac -classpath %HSQLDB_HOME%\lib\hsqldb.jar;. JDBCTest.java (1行で入力してください)
javacコマンドにclasspathオプションを指定しています。HSQLDBのJDBCドライバは、%HSQLDB_HOME%\libディレクトリにあるhsqldb.jarに含まれているので、このファイルをclasspathに指定します。
次に、実行方法です。データベースを立ち上げている必要があります。
D:\Home>java -classpath %HSQLDB_HOME%\lib\hsqldb.jar;. JDBCTest