ホーム › データベース(JDBC) › DB-01
DB-01: JDBC基本パターン(接続・クエリ・結果処理)
JDBC(Java Database Connectivity)は Java 標準の DB アクセス API です。 MySQL・PostgreSQL・Oracle・H2 など様々な DB をドライバを切り替えるだけで使える統一インターフェースを解説します。
いつ使うか
- Java アプリから MySQL・PostgreSQL・Oracle などのリレーショナル DB にアクセスするとき
- Spring や MyBatis などの ORM フレームワークを使わず、SQL を直接書いて処理したいとき
- 外部ライブラリが使えない環境(組み込みシステム・レガシー環境)での DB アクセス
- バッチ処理で大量データを効率よく読み書きするとき
主な JDBC インターフェース
| クラス/インターフェース | 役割 |
|---|---|
Connection | DB との接続を表す。使い終わったら必ずクローズする |
Statement | SQL を実行する。パラメータなしの場合に使用 |
PreparedStatement | パラメータ付き SQL を安全に実行(DB-02 で詳説) |
ResultSet | SELECT の結果セット。next() でカーソルを1行ずつ進める |
サンプルコード
Java 8 では Connection・Statement・ResultSet を try-with-resources で管理します。Statement で SQL を組み立てる場合は SQL インジェクション対策として DB-02 の PreparedStatement を使うことを検討してください。
よくあるミス・注意点
⚠️ Connection・Statement・ResultSet は必ず try-with-resources でクローズする
クローズし忘れると DB コネクションが解放されず、コネクションプールが枯渇してアプリケーション全体が止まります。try-with-resources を使えば 例外発生時も自動でクローズされます。
⚠️ Statement で文字列結合した SQL は SQL インジェクションの温床
このサンプルの insert() メソッドは説明用としてStatement を使っていますが、 本番コードでは必ず PreparedStatement を使ってください(DB-02 参照)。
⚠️ rs.getString() は null を返す場合がある
DB の列が NULL の場合、rs.getString("col") はnull を返します。 null チェックを怠ると NullPointerException が発生します。rs.wasNull() またはOptional.ofNullable() で対処しましょう。
⚠️ 本番では DriverManager でなくコネクションプールを使う
DriverManager.getConnection() は 呼び出すたびに新規接続を作成するため低速です。本番では HikariCP や c3p0 などのコネクションプールを使って接続を再利用します。
テストする観点
- SELECT で初期データが全件取得できること
- INSERT 後に件数が増えること(境界値: 0件・1件・複数件)
- UPDATE 後に対象レコードの値が変わっていること
- DELETE 後に対象レコードが消えること
- 存在しない ID を UPDATE/DELETE しても例外が発生せず、更新件数が 0 になること
- Connection を閉じた後に SQL を実行すると
SQLExceptionになること