JDBCの概要
JDBC(Java Database Connectivity)は、Javaアプリケーションが様々なデータベースと統一的な方法で通信するためのAPI(アプリケーション・プログラミング・インターフェース)です。JDBCを利用することで、データベースの種類に依存せず、標準的なインターフェースでデータの検索、挿入、更新、削除といった操作を実行できます。
JDBCの主なコンポーネント
JDBCは、主に以下の2つの部分で構成されています。
- JDBC API:データベース操作のためのインターフェースとクラス群。開発者が直接利用する部分です。
- JDBCドライバ:特定のデータベース向けにJDBC APIを実装したソフトウェア。データベースベンダーが提供します。
JDBC APIの中心的なインターフェースには、以下のものがあります。
DriverManager:データベースドライバを管理し、接続を確立します。Connection:データベースとの接続を表します。Statement/PreparedStatement:SQL文の実行と結果の取得に使用します。ResultSet:SQLクエリの結果セットを表し、データを取得するために使用します。
JDBCの基本的な使用手順
Javaでデータベースを操作する基本的な流れは以下の通りです。
1. JDBCドライバのロード
まず、使用するデータベースのJDBCドライバをクラスパスにロードする必要があります。通常、Class.forName()メソッドを使用します。
Class.forName("org.postgresql.Driver");
Mavenを使用する場合は、プロジェクトのpom.xmlに依存関係を追加します。
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.3</version>
</dependency>
2. データベース接続の確立
DriverManagerクラスのgetConnectionメソッドを呼び出して、データベースへの接続を確立します。接続情報として、URL、ユーザー名、パスワードを指定します。
// 接続情報
String dbUrl = "jdbc:postgresql://localhost:5432/mydatabase";
String user = "myuser";
String pass = "mypassword";
// 接続の確立
Connection dbConn = DriverManager.getConnection(dbUrl, user, pass);
接続URL(dbUrl)は、プロトコル、サブプロトコル、ホスト名、ポート番号、データベース名で構成されます。さらに、文字エンコーディングやタイムゾーンなどの接続パラメータを付加することもできます。
3. Statementオブジェクトの作成
ConnectionオブジェクトからStatementまたはPreparedStatementオブジェクトを作成し、SQL文を実行する準備をします。
// Statementオブジェクトの作成
Statement stmt = dbConn.createStatement();
4. SQL文の実行
Statementオブジェクトのメソッドを使用して、SQL文を実行します。データの更新(INSERT, UPDATE, DELETE)にはexecuteUpdate、データの検索(SELECT)にはexecuteQueryを使用します。
// SELECT文の実行
String sql = "SELECT id, product_name, price FROM products";
ResultSet rs = stmt.executeQuery(sql);
5. クエリ結果の処理
ResultSetオブジェクトは、クエリの結果を保持します。結果セット内の行を順に処理するには、next()メソッドを使用してカーソルを移動させます。
// 結果セットの処理
while (rs.next()) {
int id = rs.getInt("id"); // 列名で値を取得
String name = rs.getString(2); // 列のインデックス(1から始まる)で値を取得
double price = rs.getDouble("price");
System.out.println("ID: " + id + ", 商品名: " + name + ", 価格: " + price);
}
注意点:ResultSetの列インデックスは0ではなく1から始まります。また、getXXX()メソッドは列のインデックスまたは列名のいずれかで値を取得できます。
6. リソースの解放
データベース操作が完了したら、使用したリソース(ResultSet, Statement, Connection)を解放する必要があります。リソースは開いた順と逆の順序で閉じるのが原則です。現代的なJavaでは、try-with-resources文を使用して自動的にリソースを解放するのが推奨されます。
// try-with-resourcesを使用した自動解放
try (Connection conn = DriverManager.getConnection(dbUrl, user, pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
// 結果の処理
}
} catch (SQLException e) {
e.printStackTrace();
}
// このブロックを抜けると、conn, stmt, rsは自動的にclose()されます。
例外処理
JDBC操作中にデータベース接続の失敗、SQL文の構文エラーなど、様々な例外が発生する可能性があります。これらの例外はSQLExceptionとしてスローされます。適切な例外処理(try-catchブロック)を実装して、プログラムの安定性を確保する必要があります。