/** Az Adatbázis-programozás fejezet példaprogramjai.
A Java nyelv hálózati szolgáltatásai miatt ideálisan megfelel kliens-szerver architektúrájú adatbázis-kezelő programok létrehozására. Ezért felmerült az igény a legkülönfélébb adatbázisok elérési lehetőségére, amit a JDBC biztosít.
Tartalomjegyzék a hivatkozott referenciákkal és felhasznált képekkel:
JDBC meghajtóprogramok
Két- és háromrétegű adatbázis-elérési modell
JDBC-nek megfelelő meghajtóprogramok
  • Referenciák:
    • A {@link java.sql.Driver} interfész
ODBC--JDBC
Továbbfejlesztési tervek
A JDBC használata
Fordítás
Futtatás
Meghajtóprogramok kezelése
A meghajtóprogram kiválasztása
  • Referenciák:
    • A {@link java.sql.DriverManager} osztály
Meghajtóprogramok regisztrálása
Kapcsolattartás az adatbázissal
Adatbázis-URL-ek
Kapcsolat felvételének hagyományos módja
  • Referenciák:
    • A {@link java.sql.DriverPropertyInfo} osztály
Kapcsolat felvételének ajánlott módja
  • Referenciák:
    • A {@link javax.sql.DataSource} interfész
Kapcsolatok újrahasznosítása
  • Referenciák:
    • A {@link javax.sql.ConnectionPoolDataSource} interfész
    • A {@link javax.sql.PooledConnection} interfész
    • A {@link javax.sql.ConnectionEventListener} interfész
    • A {@link javax.sql.ConnectionEvent} osztály
Tranzakciókezelés
  • Referenciák:
    • A {@link java.sql.Savepoint} interfész
Tranzakció-izolációs szintek
Globális tranzakciók
  • Referenciák:
    • Az {@link javax.sql.XADataSource} interfész
    • Az {@link javax.sql.XAConnection} interfész
Információ a kapcsolatról
  • Referenciák:
    • A {@link java.sql.DatabaseMetaData} interfész
Hibakezelés
  • Referenciák:
    • Az {@link java.sql.SQLExcepiton} kivétel
    • Az {@link java.sql.SQLWarning} kivétel
Kapcsolat lezárása
JDBC típusok
A JDBC típus használata
SQL -- Java típusmegfeleltetés
CHAR, VARCHAR és LONGVARCHAR
DECIMAL és NUMERIC
BINARY, VARBINARY és LONGVARBINARY
BIT, BOOLEAN
Egész számok
Lebegőpontos számok
Dátum/idő
  • Referenciák:
    • A {@link java.sql.Date} osztály
    • A {@link java.sql.Time} osztály
    • A {@link java.sql.TimeStamp} osztály
Hivatkozás
SQL3 adattípusok
BLOB/CLOB
  • Referenciák:
    • A {@link java.sql.Blob} interfész
    • A {@link java.sql.Clob} interfész
ARRAY
  • Referenciák:
    • Az {@link java.sql.Array} interfész
REF
  • Referenciák:
    • A {@link java.sql.Ref} interfész
Az SQL NULL kezelése
Felhasználói SQL adattípusok
Paraméteres (DISTINCT) felhasználói SQL típus
Strukturált (STRUCT) felhasználói SQL típus
  • Referenciák:
    • A {@link java.sql.Struct} interfész
Felhasználói SQL adattípusok Java megfeleltetése
  • Referenciák:
    • Az {@link java.sql.SQLData} interfész
    • Az {@link java.sql.SQLInput} interfész
    • Az {@link java.sql.SQLOutput} interfész
    • A {@link elte.java2_utikalauz5.jdbc.Rovidnev}, {@link elte.java2_utikalauz5.jdbc.Penz}, {@link elte.java2_utikalauz5.jdbc.Lakhely}, {@link elte.java2_utikalauz5.jdbc.Teljesnev}, {@link elte.java2_utikalauz5.jdbc.Szemely} és {@link elte.java2_utikalauz5.jdbc.Dolgozo} példatípusok
Adatbázisbeli Java objektumok
SQL utasítások végrehajtása
A Statement interfész
  • Referenciák:
    • A {@link java.sql.Statement} interfész
Statement létrehozása
Statement végrehajtása
Statement megszakítása
Statement befejeződése
Escape-szintaxis használata
A PreparedStatement interfész
  • Referenciák:
    • A {@link java.sql.PreparedStatement} interfész
PreparedStatement létrehozása
PreparedStatement végrehajtása
Bemenő paraméterek típusának lekérdezése
  • Referenciák:
    • A {@link java.sql.ParameterMetaData} interfész
Bemenő paraméterek értékének megadása
Nagyméretű bemenő paraméterek megadása
A CallableStatement interfész
  • Referenciák:
    • A {@link java.sql.CallableStatement} interfész
CallableStatement létrehozása
CallableStatement végrehajtása
Kimenő paraméterek értékeinek lekérdezése
SQL utasítások kötegelt végrehajtása
Kötegelt végrehajtás előkészítése
Kötegelt végrehajtás indítása
Hibakezelés kötegelt végrehajtás esetén
  • Referenciák:
    • A {@link java.sql.BatchUpdateException} kivétel
Példa kötegelt végrehajtásra
int[] updateCounts;
Connection con=...                        // a felhasználandó adatbáziskapcsolat
Statement stmt=null;                             // a végrehajtandó SQL utasítás
try {
    con.setAutoCommit(false);            // automatikus véglegesítés kikapcsolva
    stmt = con.createStatement();                       // Statement létrehozása
    stmt.addBatch("CREATE TABLE NEVEK OF TELJESNÉV");       // tábla létrehozása
    stmt.addBatch("INSERT INTO NEVEK VALUES ('Gábor', 'Dénes')");  // feltöltése
    stmt.addBatch("INSERT INTO NEVEK VALUES ('Máté', 'Barbara')");
    stmt.addBatch("INSERT INTO NEVEK VALUES ('Csilla', 'Péter')");
    stmt.addBatch("DELETE FROM NEVEK");                            // és ürítése
    updateCounts = stmt.executeBatch();             // eredmény: {0, 1, 1, 1, 3}
    stmt = con.prepareStatement(       // ismétlődő feltöltés
                  "INSERT INTO NEVEK VALUES (?, ?)"); //előfordított utasítással
    ((PreparedStatement)stmt).setString(1, "Névtelen");
    for (int i=1; i<=10; i++) {
        ((PreparedStatement)stmt).setString(2, "Felhasználó"+i );
        stmt.addBatch();
    }
    updateCounts = stmt.executeBatch();       // eredmény: {1,1,1,1,1,1,1,1,1,1}
    stmt.addBatch("SELECT * FROM NEVEK");                     // itt még nem, de
    updateCounts = stmt.executeBatch(); //itt Exception (mivel select nem lehet)
} catch (BatchUpdateException bue) {                 // hibaüzenet megjelenítése
        System.err.println("BatchUpdateException: " + bue.getMessage());
        System.err.println("SQLState:  " + bue.getSQLState());
        System.err.println("ErrorCode:  " + bue.getErrorCode());
        System.err.println("Sikeres végrehajtások sormódosítási számai:");
        updateCounts = bue.getUpdateCounts();
        for (int i=1; i<=updateCounts.length; i++)
             System.err.println("\t" + i + ".: " + updateCounts[i]);
} catch (SQLException se) {
        System.err.println("SQLException: " + se.getMessage());
        System.err.println("SQLState:  " + se.getSQLState());
        System.err.println("ErrorCode:  " + se.getErrorCode());
} finally {                                        // erőforrások felszabadítása
        if (stmt != null) try {                            // Statement lezárása
           stmt.close();
        } catch (SQLException se) {}
        if (con != null)  try {                   // adatbáziskapcsolat lezárása
           con.close();
        } catch (SQLException se) {}
}
    
Eredménytáblák kezelése
Eredménytábla típusok
Eredménytábla létrehozása
Eredménytábla elérésének optimalizálása
Navigálás az eredménytáblában
Értékek beolvasása
  • Referenciák:
    • A {@link java.sql.ResultSetMetaData} interfész
Értékek módosítása
Új sor beszúrása
Sor törlése
Változások észlelése
Eredménytábla lezárása
Önálló eredménytáblák
Adatforrás megadása
Eredménytábla feltöltése
  • Referenciák:
    • A {@link javax.sql.RowSetInternal} interfész
    • A {@link javax.sql.RowSetReader} interfész
    • A {@link javax.sql.RowSetWriter} interfész
Eredménytábla használata
  • Referenciák:
    • A {@link javax.sql.RowSetMetaData} interfész
Eredménytábla események
  • Referenciák:
    • A {@link javax.sql.RowSetListener} interfész
    • A {@link javax.sql.RowSetEvent} osztály
Önálló eredménytábla megvalósítások
  • Referenciák:
    • A {@link javax.sql.rowset} csomag
    • A {@link javax.sql.rowset.BaseRowSet} osztály
Önálló JDBC táblák
  • Referenciák:
    • A {@link javax.sql.rowset.JdbcRowSet} interfész
    • A {@link javax.sql.rowset.RowSetWarning} kivétel
Memória táblák
  • Referenciák:
    • A {@link javax.sql.rowset.CachedRowSet} interfész
    • A {@link javax.sql.rowset.spi} csomag
    • A {@link javax.sql.rowset.spi.SyncProvider} osztály
    • A {@link javax.sql.rowset.spi.SyncProviderException} kivétel
    • A {@link javax.sql.rowset.spi.SyncResolver} interfész
    • A {@link javax.sql.rowset.spi.SyncFactory} osztály
A következő példa lapozást használva végigmegy a teljes memóriatábla összes során:
Connection con = ...
CachedRowSet crs = ...

crs.setPageSize(100);                                   //100 soronként lapozunk
crs.execute(con);                                          //első lap feltöltése
do {
    while(crs.next()) {
        ...                                                     //sorfeldolgozás
    }
} while(crs.nextPage());                                               //lapozás
\end{verbatim}
            

Az alábbi kóddal a véglegesítéskor fellépő szinkronizálási konfliktusokat saját magunk is feloldhatjuk:
Connection con = ...
CachedRowSet crs = ...

try {
    crs.acceptChanges(con);             //változások visszaírása az adatforrásba
} catch (SyncProviderException spe) {       //szinkronizálási hibák feldolgozása
    SyncResolver resolver = spe.getSyncResolver();
    Object régiérték;                     //az adatforrásból jövő aktuális érték
    Object ütközőérték:               //a szinkronizálási ütközést kiváltó érték
    Object újérték:                                   //a hibát feloldó új érték
    while(resolver.nextConflict())  {                  //ütközések végigolvasása
        if (resolver.getStatus() == SyncResolver.UPDATE_ROW_CONFLICT) {//módosít
            crs.absolute(resolver.getRow());  //eredeti adatforrásban pozícionál
            int oszlopok = crs.getMetaData().getColumnCount();  //oszlopok száma
            for (int oszlop = 1; oszlop <= oszlopok; oszlop++) {
                ütközőérték = resolver.getConflictValue(oszlop);
                if (ütközőérték != null)  {           //van ütközés az oszlopban
                    régiérték = crs.getObject(oszlop);
                    újérték = ...                            //ütközés feloldása
                    resolver.setResolvedValue(oszlop, újérték);
                }
            }
        }
    }
}
            

Hálózati táblák
  • Referenciák:
    • A {@link javax.sql.rowset.WebRowSet} interfész
Szűrt táblák
  • Referenciák:
    • A {@link javax.sql.rowset.FilteredRowSet} interfész
    • A {@link javax.sql.rowset.Predicate} interfész
Önálló táblák összekapcsolása
  • Referenciák:
    • A {@link javax.sql.rowset.JoinRowSet} interfész
    • A {@link javax.sql.rowset.Joinable} interfész
Példa
@link.forrásfájl {@docRoot}/../data/jdbc/src package-info.java @author Kispitye Software */ package elte.java2_utikalauz5.jdbc;