JavaとDBの「つながる仕組み」
Javaとデータベースはどうつながってる?
「このコードってどうやって動いてるんですか?」
Javaでデータベースに値を登録する処理を見たとき、そんな素朴な疑問がわいた。
なんとなく setString() や executeUpdate() を使っていたけど、実際に何が起きているのかは意外と曖昧だったりする。
まずはコード全体を見てみよう
以下は、データベースに新しいユーザ情報を登録するシンプルなコードだ。
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO users (username, email, password) VALUES (?, ?, ?)"
)) {
stmt.setString(1, "taro");
stmt.setString(2, "taro@example.com");
stmt.setString(3, "securepass123");
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
どこで、何をしているの?
ここから先は、ある日の勉強会での実際の対話。
先輩エンジニアが、行ごとにこのコードをほどいてくれた。
Y「Connectionとか PreparedStatementとか、名前は知ってるけど、正直フワッとしてます…」
I「じゃあこのコードを、“電話をかけて、話して、切る”っていう流れにたとえてみようか」
電話をかける:データベースとの接続(Connection)
Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
これは、「このデータベースに接続します」という処理。
DriverManager は電話帳のようなもので、指定された情報(URL・ユーザー名・パスワード)を使って、正しいデータベースへつないでくれる。
話す内容を準備する:命令を用意(PreparedStatement)
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO users (username, email, password) VALUES (?, ?, ?)"
);
次にやることは、「話す内容を準備する」こと。
ここで言う“話す内容”とは、SQL文のこと。
? は「あとで値を差し込む場所」で、SQLインジェクションを防ぐためにも重要な書き方になる。
話したいことを詰める:値のバインド
stmt.setString(1, "taro");
stmt.setString(2, "taro@example.com");
stmt.setString(3, "securepass123");
ここで、準備していた ? の部分に実際の値を当てはめていく。
順番はSQL文中の ? の位置に対応している。
これで、「どんな命令を誰に対して実行するか」が具体的になる。
実行する:命令を送信(executeUpdate)
stmt.executeUpdate();
いよいよ、準備した命令を“話す”瞬間。
この一文でSQLが実行され、データベース側に新しいユーザ情報が登録される。
電話を切る:リソースの自動解放(try-with-resources)
try (Connection conn = ...; PreparedStatement stmt = ...) {
...
}
try-with-resources構文を使うと、tryブロックを抜けたときに、conn.close()やstmt.close()が自動的に呼ばれる。
つまり「電話を切る」のも忘れないように、Javaが気を利かせてやってくれるというわけ。
まとめ:JavaからDBに話しかける5ステップ
Y「なるほど…!JavaとDBのやり取りって、ちゃんと順を追えば“話す”みたいに見えてくるんですね」
I「そう。慣れると、接続 → 命令準備 → 値バインド → 実行 → 終了処理 っていう5ステップが頭に入って、どんなSQLでも落ち着いて書けるようになるよ」
Y「すごく視界が開けた気がします。これからもっと色んなSQLを触ってみたくなりました!」
I「それが一番の学びだね。コードは“読めば読むほどしゃべってくる”から、楽しんでな」
Discussion