JDBCとは?Javaでデータベースを使うしくみを初心者向けに解説
新人
「先輩、Javaでデータベースに接続するにはどうすればいいんですか?SQLを直接書くだけではだめなんでしょうか?」
先輩
「Javaではデータベースに接続して操作するためにJDBCという仕組みが用意されているんだよ。これを使うとSQLをJavaプログラムの中から実行できるんだ。」
新人
「JDBCって名前は聞いたことがありますけど、具体的に何をしているんですか?」
先輩
「それじゃあ、まずはJDBCが何かという基本から順番に見ていこう。」
1. JDBCとは?
JDBC(Java Database Connectivity)とは、Javaでデータベースに接続してSQLを実行するための標準APIです。初心者がJavaでデータベースを操作したい場合、この仕組みを理解することが最初のステップになります。JDBCを使えば、MySQLやPostgreSQL、Oracle Databaseなど様々なデータベースに同じJavaコードから接続できます。
具体的には、JDBCはJavaアプリケーションとデータベースの間に橋渡しの役割を果たします。例えば、新人エンジニアがユーザー情報をデータベースに保存したいときや、登録されたデータを検索して画面に表示したいときにJDBCが活躍します。Javaの標準ライブラリに含まれているため、特別な外部ツールを用意しなくても利用できます。
また、JDBCを理解することでSpring FrameworkやSpring Bootを使った本格的なデータベース開発にもスムーズに進むことができます。実際に業務システムやWebアプリケーションでは必ずといっていいほどデータベース接続が必要となるため、この知識は欠かせません。
2. Javaでデータベースを操作する仕組み(JDBCの役割)
Javaからデータベースを操作するには、JDBCを通じて次の流れで処理が進みます。
- データベース接続ドライバを読み込む
- 接続文字列を使ってデータベースに接続する
- SQL文を作成して実行する
- 結果を取得して処理する
- 接続を切断してリソースを解放する
これらはすべてJDBCが提供するクラスやインターフェースを通じて行われます。例えばDriverManagerを使って接続を取得し、Connectionオブジェクトを通じてSQL文を送信します。そしてStatementやPreparedStatementを利用してSQLを実行し、ResultSetでデータを受け取るという流れです。
次のサンプルコードは、pleiades環境でGradleを利用してプロジェクトを作成した場合に基本的な接続を行う例です。Springの@Controllerクラスの一部に記述し、ボタンを押したときにデータベースへ接続して処理するイメージを掴むことができます。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
@Controller
public class JdbcController {
@GetMapping("/jdbc-test")
public String testJdbc() {
try {
// JDBCドライバのロード
Class.forName("com.mysql.cj.jdbc.Driver");
// データベース接続
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testdb",
"root",
"password"
);
// SQL実行
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
System.out.println("ユーザーID: " + rs.getInt("id"));
System.out.println("ユーザー名: " + rs.getString("name"));
}
// リソース解放
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return "jdbcView";
}
}
上記のコードは非常に基本的な例ですが、JDBCの流れを理解するには最適です。実際のプロジェクトではこの接続処理を共通化したり、例外処理やトランザクション管理を加えることで堅牢なアプリケーションを構築します。
このようにJDBCはJavaプログラムとデータベースの橋渡しをしてくれるため、「Java データベース接続」を学ぶ上での第一歩になります。さらにSpringと組み合わせることで効率的な開発が可能になるため、初心者のうちからしっかり理解しておくことが大切です。
3. JDBCの基本構成要素(DriverManager、Connection、Statement、ResultSet)
ここからはJDBCを理解するために欠かせない基本構成要素を詳しく見ていきます。JDBCは単なるライブラリではなく、いくつかの重要なクラスやインターフェースが組み合わさって成り立っています。初心者が混乱しやすい部分なので、一つひとつの役割をかみくだいて説明します。
DriverManagerは、データベースドライバを管理して接続を確立するための入り口です。実際にJavaプログラムからデータベースに接続する際には、このDriverManagerを通じてConnectionを取得します。
Connectionは、実際にデータベースとのセッションを保持するオブジェクトです。これを使うことでSQL文を送信したり、トランザクションを管理することが可能になります。
Statementは、データベースに対して実際のSQLを送信するためのオブジェクトです。簡単な使い方としてはStatementを利用してSQL文を実行しますが、プレースホルダを使った効率的な実装を行う場合にはPreparedStatementを使うことが多いです。
ResultSetは、SQLの実行結果を保持するオブジェクトです。検索結果が返ってきた場合、このResultSetを通じて一行ずつデータを取り出すことができます。カーソルを進めながら列ごとに値を取得するイメージです。
この四つの要素は、Java データベース接続を行う上で必ず登場する基本の部品です。それぞれのつながりをイメージできるようになれば、JDBCの使い方が理解しやすくなります。
4. JDBCを使った簡単な接続コード例
次に、実際のコードを通じてJDBCの使い方を確認していきましょう。ここでは短いサンプルコードを紹介しますが、この中にDriverManager、Connection、Statement、ResultSetがどのように使われるのかを意識しながら読むと理解が深まります。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
@Controller
public class SimpleJdbcController {
@GetMapping("/simple-jdbc")
public String connectJdbc() {
try {
// JDBCドライバをロード
Class.forName("com.mysql.cj.jdbc.Driver");
// データベースに接続
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testdb",
"root",
"password"
);
// SQL文を作成して実行
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name FROM users");
// 結果を一行ずつ取得
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id"));
System.out.println("名前: " + rs.getString("name"));
}
// リソース解放
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return "jdbcResult";
}
}
このコードでは、DriverManagerを通じてConnectionを取得し、Statementを使ってSQL文を実行しています。そしてResultSetを通じて結果を取得していることがわかります。これはJDBCのもっとも基本的な使い方の一例であり、Java データベース接続の流れを初心者が理解するための良い練習になります。
また、実際の業務システムでは同じコードが繰り返し登場するため、共通化することや、例外処理を強化することが重要になります。その点ではSpring Frameworkが提供する機能と組み合わせることでより効率的に開発できるようになります。
5. Springプロジェクト(pleiades+Gradle環境)におけるJDBC利用のイメージ
ここからはSpringプロジェクトにおけるJDBCの利用イメージを紹介します。開発環境はpleiadesを利用し、プロジェクトはGradleで構成します。依存関係はpleiadesのチェック機能から追加することが可能です。初心者にとっては環境構築の流れもつかんでおくと理解が深まります。
Springでは@Controllerを使ってリクエストを受け付け、サービスやリポジトリ層からデータベースにアクセスする形が基本です。しかし、JDBCの理解を深めるためにはまずController内で直接データベースに接続するイメージを掴むことが役立ちます。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@Controller
public class UserController {
@GetMapping("/user-list")
public String getUserList() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testdb",
"root",
"password"
);
PreparedStatement pstmt = conn.prepareStatement("SELECT id, name FROM users");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println("ユーザーID: " + rs.getInt("id"));
System.out.println("ユーザー名: " + rs.getString("name"));
}
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return "userListView";
}
}
この例ではPreparedStatementを利用してSQLを実行しています。Statementと違い、プレースホルダを使えるためセキュリティ面でも有利です。SpringプロジェクトにおけるJDBCの使い方を理解することで、後にSpring JDBCやJPAといった高度な技術に進むための基礎が身につきます。
初心者が最初に学ぶべきなのは、このようなJava データベース接続の基本的な流れを体で覚えることです。実際にpleiadesの環境でGradleプロジェクトを作成し、依存関係を追加して、ControllerにJDBCコードを書き、動かしてみるという一連の流れを経験すると確実に理解が深まります。
JDBCの使い方を学ぶことは、単にSQLを実行するだけでなく、Javaの例外処理やリソース管理を学ぶ良い機会にもなります。特にtry-catch構文やfinallyブロックを組み合わせることで、堅牢で安定したアプリケーション開発が可能になります。初心者の段階でこれを身につけておくことが、その後の成長に大きな意味を持ちます。
6. JDBCを使うときの注意点(例:例外処理、リソース解放)
ここからは実際に開発で役立つ注意点を丁寧に整理します。初心者が最初につまずきやすいのは、例外処理の不足とリソース解放の漏れです。JDBCとはどのような場面でもデータベースと通信するため、通信途中の障害や設定の誤りが起きる可能性があります。接続が失敗したときや実行中にネットワークが切れたときに備えて、確実に例外を捕捉して原因を特定しやすいメッセージを残すことが大切です。さらに、接続や文や結果の三つのリソースは必ず閉じる必要があります。開放を忘れると接続が占有されたままとなり、時間が経つほど動作が重くなる原因になります。
もう一つの重要な点は、実行計画を安定させて安全性を高める構文の活用です。特に検索や登録の処理では、値を文字列結合で組み立てる書き方は避けるべきです。パラメータを埋め込む仕組みを使えば、入力値が特別な記号を含んでいても安全に扱うことができます。これは不正な命令の混入を防ぐ基本であり、学習の早い段階から習慣化することが望ましい考え方です。さらに、時間のかかる処理や複数の表をまたぐ処理では、途中で失敗した場合に全体をやり直すための制御が必要になります。途中で一部だけが反映されると、画面に表示される内容と保存されている内容が食い違うおそれがあるためです。
例外処理は種類を分けて考えると理解しやすくなります。設定の不備や資格情報の誤りに関する例外と、通信の障害や一時的な不具合に関する例外では対処が異なります。前者は設定を見直すべき内容であり、後者は再試行や案内の表示が有効です。どちらの場合も記録を残すことが重要で、記録に時刻と操作内容を含めておくと後からの調査が格段に進めやすくなります。初心者の段階では画面にそのまま表示するのではなく、記録に残して画面には簡潔な案内を出すという形を覚えておくと安全です。
次の短い例では、値を受け取りつつ安全に実行し、確実に解放する基本の流れを示します。ここではやさしい構成で考え方をつかむことを目的とします。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@Controller
public class SafetyController {
@GetMapping("/safe-search")
public String safeSearch(@RequestParam(name = "name", required = false) String name) {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String pass = "password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
// 設定の不備は記録して簡潔に案内
System.err.println("ドライバの読込に失敗しました");
return "errorView";
}
try (Connection conn = DriverManager.getConnection(url, user, pass);
PreparedStatement ps = conn.prepareStatement("SELECT id, name FROM users WHERE name LIKE ?")) {
ps.setString(1, name == null ? "%" : "%" + name + "%");
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getInt("id") + ":" + rs.getString("name"));
}
}
} catch (Exception e) {
System.err.println("検索処理で例外が発生しました");
}
return "safeSearchView";
}
}
この例では自動解放の構文を用いて接続や文や結果を確実に閉じています。さらに入力値を安全に扱う構文を利用しているため、文字列の連結による不具合を回避できます。JDBCとはこうした小さな注意の積み重ねで安定性を高める技術であり、基本の型を体に覚えさせることが近道になります。
7. SpringとJDBCを組み合わせるメリット
ここではSpringと組み合わせる利点を丁寧に説明します。Javaでデータベース接続を行う際には、接続の確立や解放や例外処理などの定形作業が多く、画面や機能が増えるほど同じ作業を繰り返すことになります。Springを用いると、設定の集中管理や部品の分離が進み、同じ作業を一か所にまとめられます。たとえば接続に必要な情報や共通の記録や画面への案内などを部品化しておけば、新しい画面を増やすときの負担が軽くなります。
また、層を分けて責務を明確にできる点が大きな利点です。受け付けの層は入力の受理と遷移の制御に集中し、業務の層は目的の判断に集中し、保存の層はJDBCの詳細に集中します。こうして役割を分けておくと、仕様の変更が届いたときも影響を限定できます。さらに、設定の切り替えにより実行環境ごとの差を吸収できるため、開発の端末と試験の環境と本番の環境で接続先が異なる場合でも扱いやすくなります。これらの仕組みは規模が大きくなるほど効果が増します。
初心者にとっては、段階を踏んで理解することが重要です。まずは受け付けの層で最小の処理を呼び出し、値の確認や簡単な保存を行い、その後に構成を分けていく流れを繰り返すと自然に形が身につきます。次の例は受け付けの層から保存の層を呼び出す最小の流れを示します。ここでは単純化のために保存の層の部品を同じ場所に置いていますが、実際には別の部品として分けると見通しが良くなります。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@Controller
public class InsertController {
@GetMapping("/user-insert")
public String insert(@RequestParam("name") String name) {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String pass = "password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
System.err.println("初期化に失敗しました");
return "errorView";
}
try (Connection conn = DriverManager.getConnection(url, user, pass);
PreparedStatement ps = conn.prepareStatement("INSERT INTO users(name) VALUES(?)")) {
ps.setString(1, name);
ps.executeUpdate();
} catch (Exception e) {
System.err.println("登録処理に失敗しました");
}
return "insertDoneView";
}
}
この流れはとても小さな例ですが、受け付けの層から保存の層を呼び出すという考え方を掴むには十分です。SpringとJDBCを組み合わせることで同じ作業を繰り返さずに済み、構成を整理しながら機能を増やせます。JDBCとは基礎の技術、Springは整える技術という考え方で覚えると理解が早まります。さらに将来は実行時間の計測や記録の整備や再試行の制御なども共通化でき、開発の速さと品質の両立が期待できます。
8. JDBCを学ぶためのおすすめの方法(ドキュメント・実習方法など)
最後に学び方の道筋をまとめます。まずは小さな目標を設定して一つずつ完成させる方法が効果的です。検索と登録と更新と削除の四つを別々の画面で動かし、動作の記録を読みながら理解を深めます。特に接続の確立と解放の確認は欠かせません。実習では小さな表を用意して、最初は数件の行だけで試すと手戻りが少なくなります。入力値の検証や案内の表示も早い段階で取り入れておくと、仕上がりの質が上がります。
手順の例としては、最初に環境の準備を行い、次に簡単な検索、次に登録、最後に削除と更新の順で進めます。受け付けの層は最初から整えすぎず、必要な範囲で最小の形を保ちます。保存の層は操作ごとに部品を分けて、使い回しやすい形を意識します。動作を確かめるときは、同じ処理を複数回繰り返して接続が増え続けないことを確認し、例外を意図的に起こして記録の内容を確認します。繰り返し動かす中で、文字列の埋め込みではなく安全な構文を用いる習慣が自然に身につきます。
次の例は、複数の更新をまとめて実行し、途中で失敗した場合に全体をやり直す最小の形です。ここでは部品の考え方を体験することを目的としており、実習で役に立つ流れを示します。画面から呼び出す形を意識しつつ、途中で例外が発生した場合の挙動を確認すると理解が深まります。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@Controller
public class TxController {
@GetMapping("/tx-demo")
public String txDemo() {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String pass = "password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
System.err.println("初期化に失敗しました");
return "errorView";
}
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
conn.setAutoCommit(false);
try (PreparedStatement p1 = conn.prepareStatement("UPDATE users SET name=? WHERE id=?");
PreparedStatement p2 = conn.prepareStatement("INSERT INTO users(name) VALUES(?)")) {
p1.setString(1, "たろう");
p1.setInt(2, 1);
p1.executeUpdate();
p2.setString(1, "じろう");
p2.executeUpdate();
conn.commit();
} catch (Exception ex) {
conn.rollback();
System.err.println("途中で失敗したため取り消しました");
}
} catch (Exception e) {
System.err.println("処理に失敗しました");
}
return "txView";
}
}
この例では複数の更新を一つの流れとして扱い、途中で失敗した場合に全体を取り消しています。こうした制御は実習で強い理解に直結します。学習の後半では、時間のかかる処理での待ち時間の扱いや、画面への案内や入力の再表示など、使い手の体験を整える作業にも挑戦します。さらに範囲を広げたい場合は、記録の整備や繰り返しの制御や測定の仕組みを追加し、動作の様子を数字で確認する練習も役に立ちます。
学びを続ける際は、小さな成功を積み重ねる姿勢が何よりの近道になります。毎回の実習で一つの到達点を決め、終わったら記録に残し、次の回で見直します。JDBCとは地道な積み上げが結果につながる技術であり、Javaでデータベース接続を行う実務でも同じ考え方が生きてきます。受け付けの層と保存の層の分離や、安全な構文の徹底や、確実な解放の習慣など、基本の型を何度も繰り返して定着させることが、安定した開発への近道となります。
まとめ
今回の記事では、JDBCとは何かという基礎から、Javaでデータベース接続を行い、SQLを実行して結果を取得するまでの流れを、初心者向けに整理しました。JDBCは「Java Database Connectivity」の略で、JavaアプリケーションがMySQLやPostgreSQLなどのデータベースと通信するための標準APIです。つまり、JavaのコードからSQLを発行し、検索結果や更新件数を受け取れるようにする「橋渡し役」です。検索エンジンで「JDBC とは」「Java データベース接続」「JDBC 使い方」「JDBC サンプル」「JDBC 入門」などで調べると必ず出てくる重要テーマであり、Spring BootやSpring Frameworkで本格開発をする前に必ず通る道でもあります。
JDBCの学習で最初に押さえるべきポイントは、処理が決まった順番で進むことです。一般的には、ドライバ読み込み、接続取得、SQL作成、SQL実行、結果取得、リソース解放という流れになります。特に「リソース解放」は、初心者が見落としやすい一方で、実務では品質と安定性に直結します。ConnectionやStatementやResultSetを閉じ忘れると、接続が残り続けてサーバが重くなったり、最悪の場合は接続枯渇でサービスが停止したりします。そのため、JDBCでは確実に閉じるという習慣が最優先になります。
次に、JDBCの基本構成要素として、DriverManager、Connection、Statement(またはPreparedStatement)、ResultSetの役割を理解しました。DriverManagerは接続の入り口で、Connectionはデータベースとの会話を維持する窓口です。StatementはSQLを投げる道具で、ResultSetはSELECTの結果を行単位で取り出す容器です。ここで特に重要なのがPreparedStatementです。文字列結合でSQLを作ると入力値に引きずられて想定外のSQLになりやすく、セキュリティ事故や不具合の温床になります。PreparedStatementを使えば、値を安全に渡せて、検索や登録や更新を安定して実行できます。初心者の段階から「PreparedStatementを基本にする」という意識を持つと、将来的にSpring JDBCやORMへ進んだときにも理解が早くなります。
さらに、pleiades環境とGradle構成、そして@Controllerでリクエストを受け、画面遷移を返すイメージを通して、Webアプリの中でJDBCをどう位置付けるかも確認しました。最初はControllerに直接JDBCを書いて流れを掴み、その後はServiceやRepositoryに分けて責務を整理するのが現場の定石です。Springと組み合わせるメリットは、設定の集中管理や構造の分離が進み、同じ接続処理や例外処理を繰り返さずに済む点にあります。つまりJDBCの基礎を理解しておけば、Spring Bootのデータアクセス設計(ControllerとServiceとRepositoryの分離)にも自然に入っていけます。
まとめとして、JDBCの学習は「Javaでデータベースを扱うための最初の壁」ですが、同時に「基礎を固める最高の練習」でもあります。接続、SQL、結果取得、例外処理、リソース解放、そしてトランザクションの考え方までを小さく経験できるからです。検索キーワードとしては「JDBC 接続」「JDBC DriverManager」「JDBC Connection」「JDBC Statement」「JDBC PreparedStatement」「JDBC ResultSet」「Java SQL 実行」「Java 例外処理」「リソース解放」「try with resources」などが定番で、この記事を読み返すと復習しやすいはずです。次は、同じCRUD(検索、登録、更新、削除)を小さな表で繰り返し実装し、動かしてログを確認することで、JDBCの型が自然に身につきます。
もう少し踏み込むと、JDBCの現場利用では「性能」と「安全」と「読みやすさ」の三点が常に意識されます。性能面では、毎回接続を作って閉じる処理は重くなりやすいため、アプリ全体では接続を効率よく使う仕組みを検討します。ただし初心者の学習段階では、まずは接続取得と解放の基本形を理解することが優先です。安全面では、入力値をそのままSQL文字列に埋め込まないこと、例外が起きたときに原因を追えるように記録を残すこと、そして必要以上の情報を画面に出さないことが重要です。読みやすさの面では、受け付けの処理とデータ操作の処理を分け、責務を小さく保つことがポイントになります。
また、SELECTだけでなくINSERTやUPDATEやDELETEのような更新処理では、実行結果の確認が欠かせません。executeUpdateの戻り値は更新件数であり、期待した件数になっているかを確認すると、バグの早期発見につながります。複数の更新を連続で行う場合は、途中で失敗したときに一部だけ反映されないように、まとめて取り消す考え方が必要になります。これがトランザクションの基本で、JDBCでは自動確定を無効にしてから確定や取り消しを明示します。ここを理解しておくと、後からSpringのトランザクション管理を学ぶときに「何を自動化してくれているのか」がはっきりします。
さらに、データベース接続では「接続文字列」「利用者名」「合言葉」などの設定が必ず登場します。学習段階では固定の値で動かしても構いませんが、実務では環境ごとに切り替えられるように設定を外部に置きます。開発環境と試験環境と本番環境で接続先が違うのは普通だからです。こうした設定の分離も、JDBCを学ぶと自然に必要性が見えてきます。
このように、JDBCは単に「SQLを動かす技術」ではなく、Javaで安定したデータ処理を行うための基礎体力です。特に初心者のうちは、短いコードで動くことだけを目標にしがちですが、実務では「落ちても復旧できる」「原因が追える」「無駄に重くならない」「安全に入力を扱う」という観点が必須になります。この記事の内容を繰り返し読み、同じ型で何度も手を動かすことで、JDBCの理解は確実に深まります。
以下は、記事内容を踏まえた「安全な検索」の最小サンプルです。Controllerで受け取った値をPreparedStatementで渡し、try構文で確実に解放する形にしています。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@Controller
public class JdbcSummaryController {
@GetMapping("/jdbc-summary")
public String jdbcSummary(@RequestParam(name = "keyword", required = false) String keyword, Model model) {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String pass = "password";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
model.addAttribute("message", "ドライバ読込に失敗しました");
return "jdbcSummaryView";
}
String sql = "SELECT id, name FROM users WHERE name LIKE ?";
try (Connection conn = DriverManager.getConnection(url, user, pass);
PreparedStatement ps = conn.prepareStatement(sql)) {
String value = (keyword == null || keyword.isEmpty()) ? "%" : "%" + keyword + "%";
ps.setString(1, value);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println("ID:" + rs.getInt("id"));
System.out.println("名前:" + rs.getString("name"));
}
}
model.addAttribute("message", "検索が完了しました");
} catch (Exception e) {
model.addAttribute("message", "検索中に例外が発生しました");
}
return "jdbcSummaryView";
}
}
このサンプルで意識したいのは、SQL実行そのものよりも「安全に値を渡すこと」と「必ず閉じること」です。JDBCは細かい書き方の違いが、そのまま性能と安全性と保守性に影響します。だからこそ、最初に正しい型を覚えるのが最短ルートです。慣れてきたら、複数の更新をまとめる場面でトランザクションを意識し、途中で失敗したら取り消す流れも練習しましょう。こうした経験が、業務システムやWebアプリの品質を支える基礎体力になります。
新卒エンジニア
「JDBCって、ただJavaからSQLを実行する仕組みだと思っていましたが、部品の役割が分かれるから整理しやすいんですね。」
先輩社員
「そうだね。DriverManagerで接続を取って、Connectionで会話を維持して、StatementやPreparedStatementでSQLを投げて、ResultSetで結果を読む。まずはこの流れを体に入れよう。」
新卒エンジニア
「リソース解放を忘れると危ないという話が印象的でした。閉じ忘れが積み重なると障害につながるんですね。」
先輩社員
「その通り。だからtry構文で確実に閉じるのが基本だよ。あとSQLはPreparedStatementを基本にして、安全に値を渡す習慣を作ろう。」
新卒エンジニア
「Springと組み合わせると、ControllerとServiceとRepositoryで役割を分けられるのもイメージできました。」
先輩社員
「いいね。最初はControllerで流れを掴んで、次に分離して整理する。JDBCの基礎があると、その移行もスムーズになるよ。」
新卒エンジニア
「まずは小さな表で検索と登録を繰り返して、接続と解放と例外処理の型を覚えます!」