Gyakorlati alapok III.
SQL (adatbázis)
1 táblás lekérdezések ellenőrzése JDBC-n keresztül
Az eddig bemutatásra került JDBC-kódok korrekten le fognak futni, ha minden
más jó, azonban mindenképpen szükséges további JDBC-kódillesztéseket is
bemutatnunk. Ehhez 1 kissé egyszerűsítjűk alapként felhasznált JDBC-kódunkat:
import java.sql.*;
public class Main {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DataBase_URL = "jdbc:mysql://localhost/auto";
static final String USER = "root";
static final String PASSWORD = "";
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("Kapcsolodas az adatbazishoz...");
connection =
DriverManager.getConnection(DataBase_URL,USER,PASSWORD);
String sqlString = "SELECT
COUNT(`auto_csop_nev`) AS AutoCsoportokSzama FROM auto_csop";
System.out.println("Statement letesitese..."
+ "\n");
PreparedStatement preparedStatement =
connection.prepareStatement(sqlString);
ResultSet resultSet =
preparedStatement.executeQuery(sqlString);
System.out.println("Result:");
while(resultSet.next()){
System.out.print(resultSet.getInt("AutoCsoportokSzama"));
}
System.out.println();
resultSet.close();
connection.close();
}catch(SQLException se){
se.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(statement != null)
statement.close();
}catch(SQLException se2){
}
try{
if(connection != null)
connection.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("\nViszlat!");
}
}
Végeredmény:
Kapcsolodas az adatbazishoz...
Statement letesitese...
Result:
4
Viszlat!
Először is az SQL-utasítást elkülönítettük olyan módon, hogy külön
String típusú objektumba tettük:
String sqlString = "SELECT COUNT(`auto_csop_nev`)
AS AutoCsoportokSzama FROM auto_csop";
A preparedStatement rutin ezt küldi el
szerveroldalra...
reparedStatement preparedStatement =
connection.prepareStatement(sqlString);
...majd az executeQuery() metódusával az
eredményhalmazba (Resultset) kérdezi le az
eredményeket:
ResultSet resultSet =
preparedStatement.executeQuery(sqlString);
System.out.println("Result:");
while(resultSet.next()){
System.out.print(resultSet.getInt("AutoCsoportokSzama"));
}
Itt szükséges észrevennünk azon, eddig még nem ismertetett problémát,
miszerint pontosan ezen a helyen kell megoldanunk az adattípusok egymáshoz
való illesztését. Az 1. illesztés a fenti, String
típusú objektumnál volt a szerver felé, míg a 2. itt, visszaérkezve a
JDBC-környezetbe. Ha erre nem figyelünk, azonnali SQL-jellegű kivétel fog
keletkezni (általában column … not found a
hibaüzenet).
Gondoljunk bele, hogy a fenti példában milyen elvárt eredményünk van?
A SELECT COUNT(`auto_csop_nev`) AS AutoCsoportokSzama
FROM auto_csop" SQL-parancs azt jelenti: számoljuk meg az
auto_csop táblában, hogy hány
auto_csop_nev van (azaz ennek az oszlopnak hány
sora – értsd: ennek az attribútumnak hány konkrét manifesztálása). Az elvárt
eredményünk tehát voltaképpen 1 integer, ezt
pedig AutoCsoportokSzama adja vissza. Ezt azonban
nem lehet String típusként átvennünk, csakis
integer formájában, ezért került felhasználásra a
getInt() metódus ilyen módon:
resultSet.getInt("AutoCsoportokSzama");
Ebből következően, ha elvárt eredményünk String
típusú, akkor ennek megfelelően kell a ResultSet
„érkezési oldalát” beállítanunk. Nézzük meg a futtatható java-kódot:
import java.sql.*;
public class Main {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DataBase_URL = "jdbc:mysql://localhost/auto";
static final String USER = "root";
static final String PASSWORD = "";
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("Kapcsolodas az adatbazishoz...");
connection =
DriverManager.getConnection(DataBase_URL,USER,PASSWORD);
String sqlString = "SELECT auto_csop_nev FROM auto_csop";
System.out.println("Statement letesitese..." + "\n");
PreparedStatement preparedStatement =
connection.prepareStatement(sqlString);
ResultSet resultSet =
preparedStatement.executeQuery(sqlString);
System.out.println("Result:");
while(resultSet.next()){
System.out.print(resultSet.getString("auto_csop_nev") + "\n");
}
System.out.println();
resultSet.close();
connection.close();
}catch(SQLException se){
se.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(statement != null)
statement.close();
}catch(SQLException se2){
}
try{
if(connection != null)
connection.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("\nViszlat!");
}
}
Végeredmény:
Kapcsolodas az adatbazishoz...
Statement letesitese...
Result:
NORMAL
EXTRA
LUXUS
BEYOND
Viszlat!
A fenti kódban jól látható, hogy mivel a "SELECT
auto_csop_nev FROM auto_csop" paranccsal konkrét,
String adattípusú autócsoportneveket (auto_csop_nev)
várunk vissza…
NORMAL
EXTRA
LUXUS
BEYOND
...a resultset érkezési oldalát a
getString() metódus felhasználásával ehhez kell
igazítanunk:
while(resultSet.next()){
System.out.print(resultSet.getString("auto_csop_nev") +
"\n");
}