【Java】Select文でwhereを使って動的に条件指定してデータを取得する

Java

今回の記事ではJavaでMySQLに接続してwhere句によって条件を指定したselect文によってデータを取得して表示する方法を解説していきます。

前提としてMySQL側でデータベースとテーブルが準備されていることとします。
準備ができていない方はこちらの記事を参考にしながら準備を進めてください。
使うデータベース名やテーブル名は以下の通りです。

  • データベース名:testdb
  • テーブル名:test_table
  • user: root
  • password: rootpass

なおtest_tableはintのidとvarcharのnameをカラムとして持つテーブルになります。
いくつかのデータが既に入っているものとします。

「このまま勉強を続けてプログラミングを習得できるか不安」という方におすすめなのがTech Academyの無料メンター相談です。
現役エンジニア講師とマンツーマンで無料相談できます!公式サイトから予約して、独学の不安を解消しましょう!

where句の条件を動的に変更してデータを取得する

次のようなテーブルからコマンドライン引数で指定されたidと一致するデータを取得し、出力するプログラムです。

+------+--------+
| id   | name   |
+------+--------+
|    1 | Taro   |
|    2 | jiro   |
|    3 | saburo |
+------+--------+
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class PreparedSelect {

	public static void main(String[] args) {

		// MySQLに接続するための情報を変数に格納
		String url = "jdbc:mysql://localhost:3306/testdb";
		String user = "root";
		String password = "rootpass";

		// 今回実行するsql
		// 動的に条件を指定したい箇所を「?」にする
		String sql = "select * from test_table where id = ?;";

		// データベースに接続する
		try (Connection con = DriverManager.getConnection(url, user, password);
				PreparedStatement ps = con.prepareStatement(sql)){

			// sqlの「?」の箇所にコマンドライン引数として受け取った値を設定する
			ps.setInt(1, Integer.parseInt(args[0]));

			// sqlの実行
			ResultSet rs = ps.executeQuery();

			System.out.println("idが" + args[0] + "のデータを取得します。");

			// データの数だけ繰り返す
			while(rs.next()) {
				// 取得したデータのIDを取得
				int id = rs.getInt("id");
				// 取得したデータの名前を取得
				String name = rs.getString("name");
				
				// 取得したデータを出力する
				System.out.println(id + " | " + name);
			}
		}catch (SQLException e) {
			e.printStackTrace();
		}finally {
			System.out.println("プログラムを終了します。");
		}
	}
}

データベースと接続

// MySQLに接続するための情報を変数に格納
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "rootpass";

try (Connection con = DriverManager.getConnection(url, user, password);

まずはデータベースと接続するための準備が記述してあります。
urlやuser、passwordといった変数を準備してそれをDriverManagerのgetConnectionメソッドに引数として渡します。
これによってconnectionオブジェクトを利用することができるようになります。

Select文の構築

実行したいSelect文を構築していきます。
はじめにベースとなるSQL文を記述し、String型の変数に格納します。
このとき動的に条件を変更したい箇所を「?」にしておくことが重要です。

// 今回実行するsql
// 動的に条件を指定したい箇所を「?」にする
String sql = "select * from test_table where id = ?;";

try構文の中で次のような記述があります。

PreparedStatement ps = con.prepareStatement(sql)

これでSQLを設定しています。

where句の条件指定

「?」の部分に条件を指定していきます。
先ほどSQLを設定したPreparedStatemantのオブジェクトである「ps」に対してsetIntメソッドを呼び出します。

// sqlの「?」の箇所にコマンドライン引数として受け取った値を設定する
ps.setInt(1, Integer.parseInt(args[0]));

今回はコマンドライン引数から受け取った値を設定するので、Integer.parseIntメソッドを使って、select文の「?」にしていた部分に値を設定します。

第一引数にはselect文の何番目の「?」に値を設定するのか指定しています。
第二引数にどんな値を設定するのか指定しています。

これによって次のようなselect文が作成されたことになります。

select * from test_table where id = (コマンドライン引数で受け取った数字);

作成したselect文を実行するのが次の記述です。
select文を実行して結果をResultSetとして受け取っています。

// sqlの実行
ResultSet rs = ps.executeQuery();

データの表示

while(rs.next()) {
	int id = rs.getInt("id");
	String name = rs.getString("name");
	System.out.println(id + " | " + name);
}

続いてデータの表示です。resultsetのnextメソッドを使うことで取得したデータを一行ずつ閲覧していくことが可能になります。
get〇〇メソッドの引数に取得したいカラムを指定すると該当する値を返却してくれます。

今回のテーブルではintのidとvarcharのnameがあるのでそれぞれgetIntとgetStringにidやnameといった引数を渡すことで値を取得できます。
こうして取得した値をそれぞれ変数に入れて出力します。
次の行が存在する限りwhileループ内の処理が実行され、全ての行が出力し終わるとループを抜けます。

動作確認

コマンドライン引数で2を渡して実行した場合

idが2のデータを取得します。
2 | jiro
プログラムを終了します。

コマンドライン引数で56を渡して実行した場合

idが56のデータを取得します。
プログラムを終了します。

まとめ

今回はJavaでデータベースに接続してwhere句を指定したSelect文でデータを取得する方法を解説してきました。

コメント

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