JDBCでJavaとデータベースをつなげよう!

docs

以前、Javaのプログラムを動かすために必要な「JDK」とか「JRE」について学んだよね。今回は、さらにJavaプログラミングの世界を広げるために、**「データベース接続の基本」**をマスターしちゃいましょう!

「データベース」って聞くと、なんか難しそう…って思うかもしれないけど、要は「データを整理してしまっておく場所」のこと。みんなもお店で会員登録したり、ネットショッピングで注文履歴を見たりするよね? ああいうのが全部データベースに保存されてるんだ。

じゃあ、なんでJavaでデータベースに接続する必要があるの? それは、Javaで作ったアプリケーションとデータベースの間でデータのやり取りをするためなんだ。たとえば、ユーザーが入力した情報をデータベースに保存したり、データベースに保存されている情報をJavaのプログラムで表示したりね。

このJavaとデータベースをつなぐ架け橋となるのが、今回学ぶ「JDBC」なんだ! JDBCは「Java Database Connectivity」の略で、Javaからいろんな種類のデータベースに接続するための標準的な仕組みを提供してくれるんだよ。

JDBCって何?

JDBCは、例えるなら**「データベースと話すための共通語」**みたいなもの。世界にはMySQL、PostgreSQL、Oracle Database、SQL Serverとか、いろんな種類のデータベースがあるよね。それぞれ話す言葉が違うんだけど、JDBCを使うと、Javaのプログラムはどのデータベースに対しても同じように話しかけることができるようになるんだ。

JDBCを使えば、Javaのコードをちょこっと書くだけで、複雑なデータベースの操作ができちゃうんだから、すごいよね!

データベースに接続する流れ

じゃあ、実際にJavaでデータベースに接続する基本的な流れを見ていこう! 大まかには次の4つのステップだよ。

  1. JDBCドライバーの読み込み
  2. データベースへの接続
  3. SQL文の実行
  4. 接続のクローズ

ひとつずつ、丁寧に見ていこうね!

1. JDBCドライバーの読み込み

まず最初にやることは、JDBCドライバーの読み込みだね。JDBCドライバーは、特定のデータベースとJavaを接続するための「翻訳機」みたいなもの。データベースの種類によって違うドライバーが必要になるんだ。

例えば、MySQLデータベースに接続したい場合は「MySQL Connector/J」っていうドライバーを使うんだ。これは、インターネットからダウンロードして、Javaのプロジェクトに組み込む必要があるよ。

イメージとしては、こんな感じ。

Java

// これはあくまでイメージだよ!
// 実際のコードではこんな風には書かないけど、ドライバーがプログラムに「読み込まれる」っていうことをイメージしてね。
Class.forName("com.mysql.cj.jdbc.Driver");

このClass.forName()っていうのは、「このクラスを読み込んでね!」っていうおまじないみたいなものなんだ。この行を実行すると、指定したドライバーがJavaのプログラムで使えるようになるんだよ。

2. データベースへの接続

ドライバーが読み込めたら、次はいよいよデータベースへの接続だ! ここで使うのがDriverManager.getConnection()っていうメソッド。このメソッドに、接続したいデータベースの場所(URL)、ユーザー名、パスワードを教えてあげると、データベースとの接続が確立されるんだ。

Java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbConnectionExample {

    public static void main(String[] args) {
        // データベース接続情報(これはあくまで例だよ! 自分の環境に合わせて変更してね)
        String url = "jdbc:mysql://localhost:3306/test_db"; // データベースのURL
        String user = "your_username";                     // データベースのユーザー名
        String password = "your_password";                 // データベースのパスワード

        Connection con = null; // 接続オブジェクト

        try {
            // ① JDBCドライバーの読み込み(MySQLの場合)
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("JDBCドライバーの読み込みに成功しました。");

            // ② データベースへの接続
            con = DriverManager.getConnection(url, user, password);
            System.out.println("データベースへの接続に成功しました!");

        } catch (ClassNotFoundException e) {
            System.err.println("JDBCドライバーが見つかりません: " + e.getMessage());
        } catch (SQLException e) {
            System.err.println("データベース接続エラー: " + e.getMessage());
        } finally {
            // 接続を閉じる処理(後で詳しく説明するね)
            if (con != null) {
                try {
                    con.close();
                    System.out.println("データベース接続を閉じました。");
                } catch (SQLException e) {
                    System.err.println("データベース接続のクローズ中にエラーが発生しました: " + e.getMessage());
                }
            }
        }
    }
}

このコードを実行してみて、「データベースへの接続に成功しました!」って表示されたら、第一関門突破だね!

jdbc:mysql://localhost:3306/test_dbって部分、ちょっとごちゃごちゃしてるけど、これは「JDBCを使って、MySQLデータベースの、自分のパソコン(localhost)の3306番ポートにあるtest_dbっていうデータベースに接続するよ!」っていう意味なんだ。

3. SQL文の実行

データベースに接続できたら、いよいよSQL文の実行だ! SQLっていうのは「Structured Query Language」の略で、データベースを操作するための専用の言語なんだ。データの追加、更新、削除、検索なんかは、このSQL文を使って行うんだよ。

JavaからSQL文を実行するには、主に次の2つのステップを踏むんだ。

  • Statementオブジェクトの作成
  • SQL文の実行と結果の取得

Java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement; // Statementをインポート
import java.sql.ResultSet;  // ResultSetをインポート

public class DbOperationExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test_db";
        String user = "your_username";
        String password = "your_password";

        Connection con = null;
        Statement stmt = null; // Statementオブジェクト
        ResultSet rs = null;   // ResultSetオブジェクト

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            con = DriverManager.getConnection(url, user, password);
            System.out.println("データベースへの接続に成功しました!");

            // ③ SQL文の実行

            // テーブル作成の例(一度実行すればOK)
            // MySQLでtest_dbに`users`テーブルを作成するSQL
            String createTableSql = "CREATE TABLE IF NOT EXISTS users (" +
                                    "id INT AUTO_INCREMENT PRIMARY KEY," +
                                    "name VARCHAR(100) NOT NULL," +
                                    "age INT" +
                                    ")";
            stmt = con.createStatement(); // Statementオブジェクトを作成
            stmt.executeUpdate(createTableSql); // SQLを実行(テーブル作成はexecuteUpdate)
            System.out.println("usersテーブルが存在しない場合、作成しました。");

            // データ挿入の例
            String insertSql = "INSERT INTO users (name, age) VALUES ('田中', 25)";
            int insertedRows = stmt.executeUpdate(insertSql); // データ挿入もexecuteUpdate
            System.out.println(insertedRows + "件のデータを挿入しました。");

            // データ検索の例
            String selectSql = "SELECT id, name, age FROM users";
            rs = stmt.executeQuery(selectSql); // データ検索はexecuteQuery

            System.out.println("\n--- usersテーブルのデータ ---");
            while (rs.next()) { // 1行ずつデータを取得
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("ID: " + id + ", 名前: " + name + ", 年齢: " + age);
            }

        } catch (ClassNotFoundException e) {
            System.err.println("JDBCドライバーが見つかりません: " + e.getMessage());
        } catch (SQLException e) {
            System.err.println("データベース操作エラー: " + e.getMessage());
        } finally {
            // ④ 接続のクローズ
            // 閉じる順番も大事だよ! ResultSet -> Statement -> Connection の順で閉じよう。
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (con != null) con.close();
                System.out.println("データベース接続と関連リソースを閉じました。");
            } catch (SQLException e) {
                System.err.println("リソースのクローズ中にエラーが発生しました: " + e.getMessage());
            }
        }
    }
}

ちょっとコードが長くなったけど、やってることはシンプルだよ。

  • con.createStatement()で、SQL文を実行するための「準備」をするんだ。この準備したものがStatementオブジェクト。
  • stmt.executeUpdate()は、データベースのデータを変更するSQL(INSERTUPDATEDELETEなど)を実行するときに使うよ。今回はテーブル作成とデータ挿入で使ったね。
  • stmt.executeQuery()は、データベースからデータを取得するSQL(SELECT)を実行するときに使うんだ。
  • ResultSetは、SELECT文で取得した結果を格納するためのオブジェクト。rs.next()で1行ずつデータを取り出して、rs.getInt("id")とかrs.getString("name")で各列の値を取得できるんだ。

4. 接続のクローズ

最後に、使い終わったデータベースへの接続をしっかり閉じることがとっても大事! これを忘れると、データベースのリソースが無駄に消費されちゃったり、最悪の場合はデータベースが不安定になっちゃうこともあるんだ。

接続を閉じるのは、使ったものから順番に、ResultSetStatementConnectionの順で閉じるのがお約束だよ。

上のコードのfinallyブロックを見てみて。try-catch-finallyfinallyブロックは、エラーが起きても起きなくても必ず実行される場所だから、ここで確実にリソースを解放するのがベストプラクティスなんだ。

エラーハンドリングについて

上の例でも少し触れたけど、データベース接続ではいろんなエラーが発生する可能性があるから、エラーハンドリング(エラーが起きた時にどう対処するか)がすごく重要になるんだ。

例えば、

  • JDBCドライバーが見つからない
  • データベースのユーザー名やパスワードが間違っている
  • SQL文に間違いがある

なんかの場合だね。

Javaでは、こういった例外的な状況をtry-catchブロックを使って処理するんだ。tryブロックの中に「もしかしたらエラーが起こるかもしれないコード」を書いて、エラーが起こったらcatchブロックでそのエラーを捕まえて、適切な処理を行うんだよ。

まとめ

今回はJavaのデータベース接続の基本、JDBCについて学んだね!

  • JDBCはJavaとデータベースをつなぐ共通語
  • 接続のステップは、ドライバー読み込み接続SQL実行接続クローズ
  • SQLの実行にはStatementResultSetを使う
  • 使い終わったらしっかり接続を閉じること(finallyブロックで!)

これで、Javaプログラムからデータベースにアクセスするための扉が開かれたね! 次回は、今回学んだことを活かして、より実践的なデータベース操作のテクニックや、よく使うフレームワークなんかも紹介できたらいいなと思ってるよ。

これからも一緒にJavaプログラミングを楽しんでいこうね!

関連リンク

コメント

タイトルとURLをコピーしました