talosのプログラミング教室

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、DDLSQLを発行する際は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メソッドで更新件数を取得できます。

おわりに

今回はJDBCの基本的な使い方について説明しました。