Alkalmazásfejlesztés gyakorlat Java GUI - DB
JDBC osztálykönyvtár (java.sql csomag) Oracle Driver MSSQL Driver PostgreSQL Driver SQLite Driver Oracle DB Sqlite fájl MSSQL Postgres Application
JDBC Főbb osztályok java.sql.Connection – adatbázis-kapcsolat reprezentálására java.sql.Statement – egyszerű SQL-utasításokhoz java.sql.PreparedStatement – paraméteres SQL-lekérdezésekhez optimalizálva: Nem a teljes lekérdezés szövege változik, hanem csak egyes paramétereké Az egyszer már kiértékelt lekérdezést nem kell újra kiértékelni, csak a paramétereket kell megváltoztatni Véd SQL injection ellen
JDBC Főbb osztályok Lezárás java.sql.ResultSet – lekérdezések eredményeinek bejárására: Egyszerre mindig egy sort tudunk elérni getString(), getInt(), getDate(), stb. metódusok – aktuális sor adott mezőjét adják vissza next() metódus lépteti Lezárás JDBC objektumokat le kell zárni (close) finally-ben, mindegyiket külön try-catch-ben
SQLite adatbázis http://www.sqlite.org/ Hordozható, szerver indítása nélkül használható Hiányosságok: http://www.sqlite.org/omitted.html Egyik SQL megvalósítás sem követi a szabványt Előnyökkel is rendelkezik: http://sqlite.org/speed.html sqlite3 parancssori eszköz, sqlite3 shell .read filename – parancsok végrehajtása fájlból .tables – táblák listázása .schema tablename – tábla sémája .exit – kilépés .help – Help
bookshop.db Inicializáljuk az adatbázist! cmd cd kulso\db sqlite3 bookshop.db Ha már létezik a fájl/adatbázis akkor azt megnyitja Ha nem létrehoz egy üres fájlt/adatbázist Hozzuk létre a táblákat .read bookshop.ddl Kérdezzük le milyen táblák léteznek .tables Kérdezzük le a Customer tábla sémáját! .schema Customer A shellt hagyjuk meg későbbi használatra
07-java-GUI-DB Készítsük el az alkalmazás disztribúcióját! cmd env.bat cd feladat\07-java-GUI-DB ant cd dist run.bat (MEGVÁLTOZOTT!!! és a Manifest is) Lépjünk ki, majd indítsuk újra A felvett Customerek adatai megmaradnak Nem memóriában, hanem adatbázisban tárolódtak el
07-java-GUI-DB Eclipse Lásd: 01-02_kiegeszites alatti doc file A futtatáshoz a ‚BookShopDB” környezeti változó megfelelő beállítása kell Futtatási konfiguráció Environment fül Új környezeti változó beállítása
07-java-GUI-DB Nézzük át a megváltozott forrásokat! BookShopController – getCustomers metódus Összeköti a GUIban a Customerek listázását a DAOval BookShopDAO Teljes osztály megváltozott, olvassuk át a megjegyzéseket!
07-java-GUI-DB Debuggoljuk a BookShopDAOTest.java-t TestAddAndListCustomers metódus: TestCustomer nevű Customereket veszünk fel Majd a lekérdezzük őket Futassuk le többször a debugot Közben figyeljük az adatbázis tartalmát a korábban nyitott SQLite shellben SELECT * FROM Customers; Figyelem: Sikeres teszthez új futtatás előtt törölni kell az adatbázist a UNIQUE constraint miatt
07-java-GUI-DB Debuggoljuk a BookShopDAOTest.java-t TestAddCustomerWithSameName metódus A DAOImpl hibát jelez a futás során De az nem valódi hiba, a DAO művelet sikertelen, de ezt is várjuk el tőle (azonos nevű customer nem rögzíthető)
Feladat Book/Buy Book funkcionalitás Adatbázisban rögzítsük az új könyveket Implementáljuk a könyv tárolást BookShopDAOImpl.addBook metódus implementálása Induljunk ki az addCustomer metódusból Könyv tárolás tesztelése BookShopDAOImpl-be vegyünk fel egy testBuyBook metódust! Hívjuk ezt is a mainből! Induljunk ki a testAddCustomer metódusból! Teszteljük az új metódust! (lásd: előző dia)
Feladat/Házi Az előző órai házi feladatban elkészített GUI-ra kössük rá a Controller-en keresztül az adatbázist Book/Buy Book (előző feladattal megvan) Book/List Books Ezt tegyük meg a Sell alatti funkciókra is!
Házi feladat Tranzakció Mi a tranzakció négy követelménye? Írjunk egy olyan metódust, amivel egyszerre több Customert tudunk az adatbázishoz hozzáadni, de fontos, hogy vagy mindet hozzáadjuk, vagy egyet se! Alkalmazzunk tranzakció kezelést! Lásd: tutorial zipben a basics/transactions.html)
Házi feladat JDBC tranzakció try { conn.setAutoCommit(false) conn.setTransactionIsolation(…) … conn.commit(); } catch(Exception e) { conn.rollback(); }
Házi feladat JDBC tranzakció Próbáljuk ki tranzakcióval és anélkül a metódust! Figyeljük az adatbázis tartalmát debuggolás közben: Ha tranzakcióval dolgozunk, akkor csak a conn.commit-kor jelenik meg az összes Customer. Ha anélkül, akkor minden egyes executeUpdate hívás után!