[Java] JDBC 使用 MySQL ResultSet

練習 JDBC 使用 MySQL,將 SELECT * FROM table; 的結果存成 ResultSet ,然後將他一個個 .next() 取出來每一 row 的數據,再getInt() 或 getString()。

我的練習是有三個 table 分別為 player、weapon_list 和 armor_list,在 player 中每一筆資料是角色,有名字有等級有職業有武器和防具,而武器防具只存放 id,要連去另外兩個 table weapon_list 和 armor_list 用的。練習 SELECT * FROM player; 將每個角色的資料印出來時,本來的打算是 getInt(weapon_id) 用這個去別的 table 再 query 一次取名字出來(或更進一步取攻擊力防禦力之類的),像這樣:

Connection connection = DriverManager.getConnection("....");
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("SELECT * FROM player");
while(result.next()) {
	ResultSet weaponQuery = statement.executeQuery("SELECT name FROM weapon_list WHERE id=" + result.getInt("weapon_id"));
	String weaponTemp = weaponQuery.getString("name");
    
	ResultSet armorQuery = statement.executeQuery("SELECT name FROM armor_list WHERE id=" + result.getInt("armor_id"));
	String armorTemp = armorQuery.getString("name");

	System.out.println("name: " + result.getString("name") + ", weapon: " + weaponTemp + ", armor: " + armorTemp );
}

大概像這樣的概念但是不行,大概有兩個問題:

第一,即使確定有資料不至於是空的,ResultSet 的 .next() 還是要先執行一次才可以開始抓取第一筆資料。第二,實作了 ResultSet 後要讓他 .next() 到最後傳回 false 結束,statement 才可以讓出來再來 executeQuery 別的 table,不能像上面在 player 的 query 中又跑去查找其他 table。所以要改成:

Connection connection = DriverManager.getConnection("....");
Statement statement = connection.createStatement();
Statement statement2 = connection.createStatement();		// 要再創一個來用

ResultSet result = statement.executeQuery("SELECT * FROM player");
while(result.next()) {
	ResultSet weaponQuery = statement2.executeQuery("SELECT name FROM weapon_list WHERE id=" + result.getInt("weapon_id"));
	weaponQuery.next();			// 要先執行一次
	String weaponTemp = weaponQuery.getString("name");
	weaponQuery.next();			// 要全部查找完才可以讓出來讓下一個查 armor 用

	ResultSet armorQuery = statement2.executeQuery("SELECT name FROM armor_list WHERE id=" + result.getInt("armor_id"));
   armorQuery.next();
	String armorTemp = armorQuery.getString("name");
   armorQuery.next();

	System.out.println("name: " + result.getString("name") + ", weapon: " + weaponTemp + ", armor: " + armorTemp );
	statement2.close();
}

留言