Egy adatbázis lekérdezése az adatbázis adataiban való keresést jelenti. Ezt úgy tesszük, hogy SQL utasításokat küldünk az adatbázisnak. Ehhez először is szükséged van egy nyitott adatbázis-kapcsolatra. Ha már van nyitott kapcsolatod, létre kell hoznod egy Statement
objektumot, például így:
Statement statement = connection.createStatement();
Miután létrehoztad a Statement
objektumot, használhatod SQL-lekérdezések végrehajtására, például így:
String sql = "select * from people";ResultSet result = statement.executeQuery(sql);
Amikor végrehajtasz egy SQL-lekérdezést, egy ResultSet
objektumot kapsz vissza. A ResultSet
tartalmazza az SQL-lekérdezésed eredményét. Az eredményt sorokban, oszlopos adatokban kapod vissza. A ResultSet
sorait a következőképpen iterálod:
while(result.next()) { String name = result.getString("name"); long age = result.getLong ("age");}
A ResultSet.next()
módszer a ResultSet
következő sorára lép, ha van még sor. Ha van még több sor, akkor true-t ad vissza. Ha nem volt több sor, akkor false-t ad vissza.
Legalább egyszer meg kell hívni a next()
metódust, mielőtt bármilyen adatot beolvashatnánk. Az első next()
hívás előtt a ResultSet
az első sor elé kerül.
Az aktuális sor oszlopadatait az getXXX()
egyes metódusainak hívásával kaphatjuk meg, ahol XXX egy primitív adattípus. Például:
result.getString ("columnName"); result.getLong ("columnName"); result.getInt ("columnName"); result.getDouble ("columnName"); result.getBigDecimal("columnName"); etc.
Az ilyen getXXX()
metódushívások bármelyikének paramétereként átadjuk az oszlop nevét, amelynek értékét meg szeretnénk kapni.
Átadhatjuk helyette az oszlop indexét is, például így:
result.getString (1); result.getLong (2); result.getInt (3); result.getDouble (4); result.getBigDecimal(5); etc.
Ahhoz, hogy ez működjön, tudnunk kell, hogy az adott oszlopnak milyen indexe van a ResultSet
-ben. Az adott oszlop indexét a ResultSet.findColumn()
metódus meghívásával kaphatjuk meg, így:
int columnIndex = result.findColumn("columnName");
Nagy mennyiségű sor iterálása esetén az oszlopokra való hivatkozás az indexük alapján gyorsabb lehet, mint a nevük alapján.
Ha befejeztük az ResultSet
iterálását, akkor mind a ResultSet
, mind az azt létrehozó Statement
objektumot be kell zárnunk (már ha végeztünk vele). Ezt a close()
metódusaik meghívásával teszed, így:
result.close();statement.close();
Természetesen ezeket a metódusokat egy finally
blokkban kell meghívnod, hogy biztos legyél benne, hogy akkor is meghívódnak, ha a ResultSet
iteráció során kivétel lép fel.
Teljes példa
Íme egy teljes lekérdezési kódpélda:
Statement statement = connection.createStatement();String sql = "select * from people";ResultSet result = statement.executeQuery(sql);while(result.next()) { String name = result.getString("name"); long age = result.getLong("age"); System.out.println(name); System.out.println(age);}result.close();statement.close();
És itt a példa újra, try-finally
blokkokkal kiegészítve. Vegyük észre, hogy kihagytam a catch
blokkokat, hogy rövidebb legyen a példa.
Statement statement = null;try{ statement = connection.createStatement(); ResultSet result = null; try{ String sql = "select * from people"; ResultSet result = statement.executeQuery(sql); while(result.next()) { String name = result.getString("name"); long age = result.getLong("age"); System.out.println(name); System.out.println(age); } } finally { if(result != null) result.close(); }} finally { if(statement != null) statement.close();}