Java Gold合格への道 ~JDBC・基本的な使い方~
スポンサーリンク
こんにちは。たろすです。
今回はJDBCの基本的な使い方について説明します。
検索
以下のようなテーブルを取得します。
public class Main { public static void main(String[] args) { final String URL = "jdbc:mysql://localhost:3306/javagold?characterEncoding=UTF-8"; final String USER = "****"; // 自身が設定したユーザ名 final String PASS = "****"; // 自身が設定したパスワード try (Connection con = DriverManager.getConnection(URL, USER, PASS); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM employee")) { while (rs.next()) { System.out.print(rs.getString(1) + " "); System.out.print(rs.getString(2) + " "); System.out.print(rs.getDate(3) + " "); System.out.println(rs.getDate(4) + " "); } } catch (SQLException e) { e.printStackTrace(); } } }
000001 伊藤 太郎 2022-04-01 1985-11-02 000002 坂本 啓介 2022-04-01 1972-05-21 000003 宮田 雄二 2022-05-01 1985-11-02 000004 源田 三郎 2022-05-01 1995-01-08 000005 斉藤 正治 2022-05-01 1991-09-01
順番に見ていきましょう。
final String URL = "jdbc:mysql://localhost:3306/javagold?characterEncoding=UTF-8"; final String USER = "****"; // 自身が設定したユーザ名 final String PASS = "****"; // 自身が設定したパスワード
URLは次のような形式をしています。
jdbc:データベース製品名://ホスト名[:ポート番号]/データベース名[?オプション]
今回のデータは日本語を含むため、オプションで文字コードを指定しています。
try (Connection con = DriverManager.getConnection(URL, USER, PASS); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM employee")) {
上から順番にデータベースへの接続、Statementオブジェクトの生成、クエリの実行を行っています。
executeQueryメソッドの戻り値はResultSetオブジェクトになっています。
それぞれ使用後はクローズする必要があるため、try-with-resourcesを使用しています。
while (rs.next()) { System.out.print(rs.getString(1) + " "); System.out.print(rs.getString(2) + " "); System.out.print(rs.getDate(3) + " "); System.out.println(rs.getDate(4) + " "); }
ResultSetのカーソルは、最初は一つ目のレコードの上を指しています。
nextメソッドを呼ぶことで一つ目のレコードを指し、その後も二つ目、三つ目のレコードと順番に降りていきます。
getStringメソッドはString型で引数の列の値を取得します。
getDateメソッドも同様にDate型で取得します。
get~メソッドは引数に列名をとるオーバーロード・メソッドもあります。
更新
先ほどのテーブルに6番目のレコードを追加します。
public class Main { public static void main(String[] args) { final String URL = "jdbc:mysql://localhost:3306/javagold?characterEncoding=UTF-8"; final String USER = "****"; // 自身が設定したユーザ名 final String PASS = "****"; // 自身が設定したパスワード int result = -1; try (Connection con = DriverManager.getConnection(URL, USER, PASS); Statement st = con.createStatement()) { result = st.executeUpdate("INSERT INTO employee" + "(id, name, start_date, birthday) " + "VALUES ('000006', '市川 誠', '20220503', '19971210')"); } catch (SQLException e) { e.printStackTrace(); } if (result > 0) { System.out.println("更新成功"); } else { System.out.println("更新失敗"); } } }
更新成功
result = st.executeUpdate("INSERT INTO employee" + "(id, name, start_date, birthday) " + "VALUES ('000006', '市川 誠', '20220503', '19971210')");
SELECTではexecuteQueryメソッドを使ったのに対し、UPDATEやINSERT、DELETE、DDLのSQLを発行する際はexecuteUpdateメソッドを使用します。
if (result > 0) { System.out.println("更新成功"); } else { System.out.println("更新失敗"); }
exexuteUpdateメソッドの戻り値は更新されたレコード数になっています。
このコードを実行すると以下のように更新されます。
動的な実行
例えば以下のようにSELECTか更新系かどちらが実行されるかわからない場合、executeメソッドを使用します。
public class Main { public static void main(String[] args) { final String URL = "jdbc:mysql://localhost:3306/javagold?characterEncoding=UTF-8"; final String USER = "****"; // 自身が設定したユーザ名 final String PASS = "****"; // 自身が設定したパスワード String[] sql = { "SELECT * FROM employee", "UPDATE employee SET birthday = '1996-12-10' WHERE id = '000006'" }; int index = new Random().nextInt(2); try (Connection con = DriverManager.getConnection(URL, USER, PASS); Statement st = con.createStatement()) { boolean isQuery = st.execute(sql[index]); if (isQuery) { ResultSet rs = st.getResultSet(); while (rs.next()) { System.out.print(rs.getString(1) + " "); System.out.print(rs.getString(2) + " "); System.out.print(rs.getDate(3) + " "); System.out.println(rs.getDate(4) + " "); } } else { int updateCount = st.getUpdateCount(); if (updateCount > 0) { System.out.println("更新成功"); } else { System.out.println("更新失敗"); } } } catch (SQLException e) { e.printStackTrace(); } } }
executeメソッドの戻り値はSELECTの場合true、それ以外の場合はfalseになります。
SELECTの場合はgetResultSetメソッドを使用してResultSetを取得できます。
一方でそれ以外の場合はgetUpdateCountメソッドで更新件数を取得できます。