JDBC gyakorlat

Ez itt egy kezdőknek (de talán mégse csak nekik...) szóló cikk lesz a JDBC-ről. Először az alapokat fogom bemutatni, ehhez kell egy Java Development Kit, egy MySQL adatbázis-kezelő és egy JDBC driver MySQL-hez, valamint Java és SQL ismeretek. A JDBC driver beüzemelése nem nehéz, csupán a Java classpath-ba kell beírni a JDBC driver (ami valójában egy JAR fájl) útvonalát (mivel a classpath meghatározása szintén alap Java dolog így erre sem térnék ki). Szóval elméletileg minden kész ahhoz hogy adatbázis eléréssel ruházzuk fel programjainkat.

Első feladatunk hogy létrehozzunk egy MySQL táblát. A példa kedvéért csináljunk egy fórumot ami a lokális gépen fog futni. Ehhez az adatbázis tábla:

CREATE TABLE forum(

id INT UNSIGNED NOT NULL PRIMARY KEY auto_increment,

user VARCHAR(40) NOT NULL,

email VARCHAR(80) NOT NULL,

comment TEXT

);

Ezután jöhet a lényeg. A JDBC kapcsolat teremtése a MYSQL-el. Ehhez először importálni kell a java.sql csomagot. Ezután példányosítani kell az Driver osztályt hogy használni tudjuk, majd fel kell építeni a kapcsolatot az adatbázissal. Miután az adatbázis kapcsolat létrejött, indíthatjuk a tranzakciókat az adatbázis felé. Alapállapotban az adatbázis kapcsolat felépülése után automatikusan elküldi az adatbázisnak az adatokat. Lássuk a példát:

//osztály implementációk

import java.sql;

//Osztály létrehozás stb...

...

//Adatbázis példányosítás

Class.forName("org.gjt.mm.mysql.Driver").newInstance();

//org.gjt.mm.mysql.Driver Jáva driver implementáció

java.sql.Connection con;      // Jáva kapcsolat prezentálása

con=DriverManager.getConnection("jdbc:mysql://localhost/forum?”+

          „user=user&password=password");

Amint látható az adatbázis kapcsolatot a DriverManager osztály getConnection metódusa építi fel. Az adatbázis kapcsolatot URL formában kell megadni, melynek felépítése a következő:

jdbc:adatbázis_típusa://adatbázis_host[:port]/adatbázis_neve?user=név&password= jelszó

FIGYELEM! Az adatbázis kapcsolat létrehozása SQLException kivételt okozhat így azt megfelelően kezelni kell. Ehhez létezik más módszer is, tessék utánanézni a Java API-ba.

Ezek után (ha minden jól ment), van egy élő adatbázis kapcsolatunk az adatbázis-kezelővel. A következő lépésben csináljunk egy szabvány select lekérdezést majd az eredményt írjuk ki a szabvány kimenetre.

Az adatbázis utasítás végrehajtása háromféleképpen történhet, ehhez három interfész van deklarálva. Ezek a következők:

Statement: Egyszerü SQL utasítás végrehajtására képes

PreparedStatement: Olyan utasítások hajthatók végre vele melyeknek bemeneti értéke is van.

CallableStatement: Tárolt, ki és bemeneti értékekkel rendelkező SQL utasítások végrehajtására

Lássuk hogy is megy ez:

Statement stmt=con.createStatement();

// A Connection intefész createStatment metódusának visszatérési értéke

// egy Statement objektum amely a apcsolathoz tartozó végrehajtásért

// felelős Statement interfészt adja vissza. ResultSet

// result=stmt.executeQuery("SELECT id,user,comment FROM forum"); A

// Statement interface három metódust tartalmaz SQL kérések

// végrehajtásához. Első (amit a példánál használunk), az executeQuery

// metódus,  SELECT utasítások végrehajtására szolgál és  ResultSet

// típusu objektumot ad vissza. A másik, az UPDATE, INSERT és hasonló

// kérések végrehajtása (melyek nem adnak vissza eredményt)

// az executeUpdate metódus, ennek visszatérési értéke mindig

// 0. Valamint az execute metódus amely akkor használatos ha az SQL

// utasítás többfajta eredményt is visszaad. A ResultSet objektum

// az eredménytáblát reprezentálja. A next metódus meghívásával

// a következő eredménysorra ugrik, amennyiben nincs több eredménysor,

// hamis értéket ad vissza. Tehát a kód:

int id;

String username;

String comment;

while(result)

{

// Ahhoz hogy az SQL eredményt Jávában használni tudjuk azt megfelelő

// típusra kell hozni, erre a ResultSet osztály beépített metódusokat

// tartalmaz. A metódusok az SQL eredménysor által visszaadott értékek

// számát vagy nevét várják vissza (a legtöbb metódusból int és

// String-et váró változat létezik)

      id=result.getInt(1);

      username=result.getString(2);

      comment=result.getString(3);

      //Ezután kiírjuk az értékeket

      System.out.println("id="+id+" -> "+username+" -> "+comment);

}

 

Eddig egyszerű volt az életünk, nem kellett az SQL kérésbe adatokat bevinni... most megnézzük hogy hogyan zajlana egy bizonyos sor lekérdezése. Mivel itt bemenő adatokat is kezelni kell, preparedStatement interfészt fogjuk használni.

 

String query="SELECT comment FROM forum WHERE id=?";

int id=8;

//Hibakezelés

try

{

      //PreparedStatement interfész átvétele a kapcsolatból,

      //és előfordítás

      PreparedStatement pstmt=conn.preparedStatement(query);

}

catch(SQLException e)

{

      System.out.println("SQL Hiba!");

}

try

{

      //Beállítjuk az értéket az SQL querynek

      pstmt.setInt(1,id);    

      // Az első argumentum annak a sorszáma amelyik helyre a queryben

      // az értéket be akarjuk helyetesíteni, a második argumentum maga

      // az érték.

      ResultSet result=pstmt.executeQuery();   

      // Végrehajtja az előfordított utasítást

      // Az eredmény feldolgozása ugyanúgy folyik mint az elöző esetben.

           

}catch(SQLException e)

{

      System.out.println("SQL Hiba!");

}

 

A lekérdezéseket a felkínált interfészekkel többféleképpen meglehet valósítani, itt csak lehetséges megoldást ismertettem. Mindenkinek jó kódolást.

Háber János