[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(); }
留言
張貼留言