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);
}
// (4) 後始末
rs.close();
prepStmt.close();
con.close();
} 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