JDBCとは、"Java DataBase Connectivity"の略で、Javaのデータベース操作に用いられる言葉です。
この記事では、Javaを使ったWebアプリ初学者向けに、JDBCとは何か、そのメリットや実際のデータベース操作方法を解説しています。
JDBCとは?
JDBCとは、一言でいうとJavaプログラムからデータベースを操作するためのAPIです。APIとは、"Application Programming Interface"の略で、簡単に言うと「つながり」や「接点」という意味です。
JavaのWebアプリは、Javaプログラムからデータベースにデータを読み書きします。Javaプログラム内にはSQLを記載しそれでデータベースにアクセスし、データベースは要求されたSQLを実行し結果をプログラムに返します。この一連のやりとりをするための機能が、JDBCというわけです。
以下に、JDBCの概要図を示します。
データベースを操作するためのインタフェースの集まりです。JDBC APIで定義されているインタフェースを用いて、データベースを操作するプログラムを作成します。JDBC APIは、java.sqlおよびjavax.sqlパッケージとして提供されています。
複数のJDBCドライバを管理するためのクラスです。java.sqlパッケージのDriverManagerクラスとして提供されています。
JDBCドライバマネージャーとJDBCドライバとの間で提供されているAPIです。JDBCドライバの開発者が使用します。
JDBC APIで定義されたインタフェースを実装した、データベースを操作するためのクラスの集まりです。JDBC Driver APIを通じて、JDBCドライバに定義されたデータベース操作のメソッドが、JDBCドライバマネージャークラスのメソッドに呼び出されます。JDBCドライバは、各ベンダーから提供されています。
JDBCのメリット
JDBCがあることによるメリットは、データベースに依らず、Javaプログラムからデータベースへのアクセスコードを統一できることです。
では、JDBCがない場合を考えてみましょう。データベースを操作するためのドライバ(クラスの集まり)は、各ベンダーが独自に作成することになります。それでは、ベンダーごとに異なるメソッドを定義したクラスが提供されることになります。
これでは、Javaプログラムを作成する際、データベースごとに異なるコーディングをしなければいけなくなるのです。
そこで、JDBCという仕組みがあれば、各ベンダーが提供するJDBCドライバはJDBC APIを実装しているため、データベースに依らず同じメソッドでデータベースを操作できるわけです。
JDBCによるデータベース操作方法
JDBC APIを使ってデータベースにアクセスするには、以下の手順で行います。
それでは、一つずつ詳しく見ていきます。
1.データベースに接続
データベースへの接続は、DriverManagerクラスのgetConnection()メソッドを使います。
【getConnection()メソッドの書式】
public static Connection getConnection(String url, String user, String password) throws SQLException
【使用例】
//接続オブジェクトの定義
Connection con = null;
//接続先情報を表す文字列の定義
String url = "jdbc : mysql : // localhost : 3306/abc";
//接続時に使用するユーザー名の定義
String user = "mysql";
//接続時に使用するパスワードの定義
String password = "mysql";
:
//接続が成功した時にConnectionオブジェクトを代入
con = DriverManager.getConnection(url, user, password);
:
DriverManagerクラスのgetConnection()メソッドの引数に、接続先情報を表す接続文字列および接続時に使用するユーザー名、パスワードを指定してデータベースに接続します。
DriverManagerは、登録されているJDBCドライバから、接続文字列に対応するJDBCドライバを探し、そのJDBCドライバを使用してデータベースに接続します。
接続に成功した場合は、接続オブジェクトであるConnectionオブジェクトが返ります。失敗した場合は、SQLExceptionがスローされます。
データベースに接続した後、Javaプログラムからは、取得したConnectionオブジェクトのメソッドにより、SQL文の実行準備やデータベース接続の切断、トランザクション処理を実行します。
2.PreparedStatementの作成
PreparedStatementの作成は、ConnectionインタフェースのprepareStatement()メソッドを使います。
PreparedStatementとは、実行するSQL文を格納するオブジェクトのことです。
【prepareStatement()メソッドの書式】
public PreparedStatement prepareStatement(String sql) throws SQLEXception
【使用例】
//接続オブジェクトの定義
Connection con = null;
//SQLを格納するPreparedStatementオブジェクトの定義
PreparedStatement stmt = null;
:
//接続が成功した時にConnectionオブジェクトを代入
con = DriverManager.getConnection(url, user, password);
//PreparedStatementオブジェクトに実行するSQLを代入
stmt = con.prepareStatement("SELECT ~ FROM ~ WHERE ~");
:
接続オブジェクトであるConnectionオブジェクトのpreparedStatement()メソッドの引数にSQL文を指定し、SQL文を格納して実行するためのPreparedStatementオブジェクトを生成します。
3.パラメータの設定
パラメータの設定は、PreparedStatementインタフェースのsetInt()メソッド、setString()メソッドを使います。
【setInt()メソッドの書式】
public void setInt(int index, int param) throws SQLEXception
【setString()メソッドの書式】
public void setString(int index, String param) throws SQLEXception
【使用例】
//接続オブジェクトの定義
Connection con = null;
//SQLを格納するPreparedStatementオブジェクトの定義
PreparedStatement stmt = null;
:
//接続が成功した時にConnectionオブジェクトを代入
con = DriverManager.getConnection(url, user, password);
//PreparedStatementオブジェクトに実行するSQLを代入
stmt = con.prepareStatement("SELECT ~ FROM ~ WHERE ~ =?");
:
//"WHERE ~=?" の?に入るパラメータを設定
stmt.setInt(1, ~);
:
PreparedStatementオブジェクトに格納されたSQL文がパラメータを持つ場合、setInt()メソッドやsetString()メソッドを用いてパラメータを設定します。
setInt()メソッドの()内のインデックスは、SQL文内の?の出てきた順番を表しています。
例えば、stmt = con.prepareStatement("INSERT INTO ~ VALUES(?,?,?,?)");というSQL文を考えます。この2番目の?にint型のパラメータを設定した場合は、stmt.setInt(2, ~);のようになります。
4.SQL文の実行
SELECT文でデータ検索を行う場合と、INSERT文、UPDATE文、DELETE文でデータ変更を行う場合とに分けて考えます。
データ検索
データ検索は、PreparedStatementインタフェースのexecuteQuery()メソッドを使います。
【executeQuery()メソッドの書式】
public ResultSet executeQuery() throws SQLException
【使用例】
//接続オブジェクトの定義
Connection con = null;
//SQLを格納するPreparedStatementオブジェクトの定義
PreparedStatement stmt = null;
//検索結果を格納するResultSetオブジェクトの定義
ResultSet res = null;
:
//接続が成功した時にConnectionオブジェクトを代入
con = DriverManager.getConnection(url, user, password);
//PreparedStatementオブジェクトに実行するSQLを代入
stmt = con.prepareStatement("SELECT ~ FROM ~ WHERE ~ =?");
:
//"WHERE ~=?" の?に入るパラメータを設定
stmt.setInt(1, ~);
//SQLを実行して、実行結果をresに代入
res = stmt.executeQuery();
:
executeQuery()メソッドにより、PreparedStatementオブジェクトを生成した接続オブジェクトが接続しているデータベースで、SQLが実行されます。
データ検索に成功した場合、検索結果が格納されたResultSetオブジェクトが返ります。
データ変更
データ変更は、PreparedStatementインタフェースのexecuteUpdate()メソッドを使います。
【executeUpdate()メソッドの書式】
public int executeUpdate() throws SQLException
【使用例】
//接続オブジェクトの定義
Connection con = null;
//SQLを格納するPreparedStatementオブジェクトの定義
PreparedStatement stmt = null;
//検索結果を格納するResultSetオブジェクトの定義
ResultSet res = null;
:
//接続が成功した時にConnectionオブジェクトを代入
con = DriverManager.getConnection(url, user, password);
//PreparedStatementオブジェクトに実行するSQLを代入
stmt = con.prepareStatement("UPDATE ~ SET ~ WHERE ~ =?");
:
//"WHERE ~=?" の?に入るパラメータを設定
stmt.setInt(1, ~);
//SQLを実行して、データ変更した行数を戻り値として返す
int rows = stmt.executeUpdate();
:
executeUpdate()メソッドにより、PreparedStatementオブジェクトを生成した接続オブジェクトが接続しているデータベースで、SQLが実行されます。
データ変更に成功した場合は、データ変更した行数が返ります。データ変更する行が存在しなかった場合は、「0」が返ってきます。
5.接続のクローズ
接続のクローズは、Connectionインタフェースのclose()メソッドを使います。
【close()メソッドの書式】
public void close() throws SQLException
【使用例】
//接続オブジェクトの定義
Connection con = null;
//接続先情報を表す文字列の定義
String url = "jdbc : mysql : // localhost : 3306/abc";
//接続時に使用するユーザー名の定義
String user = "mysql";
//接続時に使用するパスワードの定義
String password = "mysql";
:
//接続が成功した時にConnectionオブジェクトを代入
con = DriverManager.getConnection(url, user, password);
:
:
//データベースとの接続をクローズ
con.close();
データベースの操作が終了したら、データベースへの接続をクローズします。
まとめ
Java初心者にとっては、JDBCの仕組みは少し分かりにくいかもしれません。ConnectionだのPreparedStatementだの出てきて頭がこんがらがるでしょう。
でも、大事なことは「あるオブジェクトがこんな使われ方をしているんだな」と理解することです。ConnectionインタフェースやPreparedStatementインタフェースなどの中身のことを詳しく考え出すとキリがありません。
Javaプログラムを使って、データベースにアクセスするまでの大まかな流れを頭に入れるようにしましょう。