Skip to content
閲覧中:
1. JDBC:データベース連携 (1-50)

1. JDBC:データベース連携 (1-50)

JDBC(Java Database Connectivity)の1番から50番までの項目を、試験に出るポイントを凝縮したサンプルコードと共に解説します。


1-10. JDBCの基本構造と接続

ここでは「接続の作法」が問われます。

Java
// 1. JDBC URL: jdbc:サブプロトコル:データソース名
String url = "jdbc:derby:zoo"; 

// 2, 3, 10. DriverManagerとConnection、リソース管理
// 6. JDBC 4.0以降はClass.forName()不要
try (Connection conn = DriverManager.getConnection(url); // 接続取得
     Statement stmt = conn.createStatement()) {        // 4. Statement作成

    // 7. SQLExceptionはチェック例外。このブロック内で必須。
    System.out.println("Connected!");

} catch (SQLException e) {
    e.printStackTrace();
}
// 9. try-with-resourcesにより、ResultSet -> Statement -> Connectionの順で自動クローズ

11-25. 実行と結果取得

試験で最も「ひっかけ」が出るゾーンです。

Java
// 18. PreparedStatement: SQLを事前コンパイル。再利用可能で安全
String sql = "SELECT id, name FROM animals WHERE age > ?";

try (Connection conn = DriverManager.getConnection(url);
     PreparedStatement ps = conn.prepareStatement(sql)) {

    // 19. ? へのセット。インデックスは 1 から始まる(重要!)
    ps.setInt(1, 5); 

    // 11. executeQuery(): SELECTに使用。ResultSetを返す
    // 13. execute(): 戻り値はboolean。ResultSetが得られればtrue
    try (ResultSet rs = ps.executeQuery()) {

        // 14. rs.next(): 最初は「1行目の前」にいるので、必ず1回は呼ぶ必要がある
        // 15. 初期位置 = Before First
        while (rs.next()) {
            // 16. カラム指定も 1 から始まる
            int id = rs.getInt(1); 
            // 17. カラム名での取得も可能
            String name = rs.getString("name");

            // 23. wasNull(): 直前に読み込んだ値がDB上でNULLだったか判定
            if (rs.wasNull()) { /* 処理 */ }
        }
    }

    // 12. executeUpdate(): INSERT/UPDATE/DELETEに使用。戻り値は「更新行数(int)」
    int result = ps.executeUpdate("UPDATE animals SET name = 'Jack' WHERE id = 1");
}

26-40. スクロールと更新可能ResultSet

ResultSetを自由に動かしたり、書き換えたりする高度な設定です。

Java
// 26-30. ResultSetの型と並行性の設定
try (Statement stmt = conn.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE, // 27. 前後移動可・DB変更は非反映
        ResultSet.CONCUR_UPDATABLE)) {     // 30. ResultSet経由でDB更新可

    ResultSet rs = stmt.executeQuery("SELECT * FROM animals");

    // 35. 最終行へ
    rs.last(); 

    // 31. absolute(int): 絶対位置へ移動(2行目へ)
    rs.absolute(2); 

    // 32. relative(int): 現在地から移動(1つ戻る)
    rs.relative(-1); 

    // 36, 37. ResultSet経由の更新
    rs.updateString("name", "New Name");
    rs.updateRow(); // これを呼ばないとDBに反映されない
}

41-50. トランザクション

「一連の処理をひとまとめにする」仕組みです。

Java
try (Connection conn = DriverManager.getConnection(url)) {
    // 41, 42, 44. AutoCommitをfalseにするとトランザクション開始
    conn.setAutoCommit(false);

    try (Statement stmt = conn.createStatement()) {
        stmt.executeUpdate("UPDATE account SET balance = balance - 100 WHERE id = 1");

        // 46, 47. セーブポイントの作成
        Savepoint sp = conn.setSavepoint("PointA");

        stmt.executeUpdate("UPDATE account SET balance = balance + 100 WHERE id = 2");

        // 43. 全て成功すれば確定
        conn.commit();

    } catch (SQLException e) {
        // 44, 48. 失敗したらロールバック(セーブポイント指定も可)
        conn.rollback();
    }
}

💡 Java Gold 試験対策:JDBCの「ひっかけ」最終確認表

項目 正解(試験のポイント) よくある間違い
開始インデックス 1 0
ResultSetの初期位置 1行目の前 (Before First) 1行目
ps.setInt(1, 10) **PreparedStatement**に値をセット Statementにセット
executeUpdate()の戻り値 更新された行数 (int) ResultSet または boolean
rs.next() boolean(データがあればtrue) void または データそのもの

これでJDBCの1-50番を網羅しました。

次は、パスの計算やファイルの再帰探索がメインとなる 「NIO.2:ファイル操作 (51-100)」 のサンプルコード解説に進みますか?