Ciele
- Oboznámiť sa s tvorbou aplikácií komunikujúcich s databázovým systémom.
- Oboznámiť sa so základmi jazyka SQL.
- Implementovať funkčnosť pre prácu so zoznamom najlepších výsledkov uložených v databáze.
Úvod
- 
               Hlavným cieľom dnešného cvičenia je rozšírenie projektu o prácu s databázovým systémom.
               Pre naše potreby bol zvolený jednoduchý databázový systém Derby (Java DB),
               ktorý je implementovaný v jazyku Java.
               Napriek tomu nie je implementácia hry viazaná na tento systém a je možné použiť aj iný databázový systém
               (PostgreSQL, MySQL, HSQL a podobne).
               
            
Postup
- 
                  Pre realizáciu cieľov dnešného cvičenia bude potrebné rozšíriť implementovaný systém podľa nasledujúceho modelu.Úloha: Pridajte súbor DatabaseSetting.java do projektu hry Minesweeper. Uvedená trieda má definované konštanty obsahujúce konfiguračné údaje pre vytvorenie spojenia na databázový systém Derby ako aj údaje potrebné pre prácu s databázou (SQL príkazy).
- 
                  V tomto kroku je potrebné rozšíriť trieduBestTimestak, aby ukladala najlepšie skóre do databázy v prípade úspešného ukončenia hry a získavala toto skóre z databázy v prípade požiadavky na jeho zobrazenie.Úloha: V triedeRealizácia tejto metódy bude pozostávať z nasledujúcich krokov:BestTimesdefinujte súkromnú metóduvoid insertToDB(PlayerTime playerTime), ktorá uloží objekt triedyPlayerTimedo databázy.- 
                           Vytvorenie spojenia na databázový server so získaním objektu typu Connection. Trieda ovládača pre pripojenie na databázový server je určená hodnotou konštantyDatabaseSetting.DRIVER_CLASS. URL pre pripojenie na databázu je uvedené v hodnote konštantyDatabaseSetting.URL, meno a heslo v konštantáchDatabaseSetting.USERaDatabaseSetting.PASSWORD.Class.forName(DatabaseSetting.DRIVER_CLASS); Connection connection = DriverManager.getConnection(DatabaseSetting.URL, DatabaseSetting.USER, DatabaseSetting.PASSWORD);
- 
                           Vytvorenie databázovej tabuľky player_timev prípade, že ešte takáto tabuľka nie je vytvorená. Ak použijeme SQL príkazCREATE TABLEnad tabuľkou, ktorá už existuje, vznikne výnimka. Za tohto predpokladu môže byť implementácia nasledovná:
 Pre vytvorenie tabuľky je použitý nasledujúci príkaz jazyka SQL (TriedaStatement stm = connection.createStatement(); try { stm.executeUpdate(DatabaseSetting.QUERY_CREATE_BEST_TIMES); } catch (Exception e) { //do not propagate exception, table may already exist } stm.close();DatabaseSetting, konštantaQUERY_CREATE_BEST_TIMES).CREATE TABLE player_time (name VARCHAR(128) NOT NULL, best_time INT NOT NULL)
- 
                           Zápis mena hráča a jeho času do databázy. Pre realizáciu tejto úlohy je možné použiť objekt typu
                           PreparedStatementnasledovne:
 SQL príkaz pre uloženie mena a času hráča do tabuľky je nasledovný (triedaPreparedStatement pstm = connection.prepareStatement(DatabaseSetting.QUERY_ADD_BEST_TIME); pstm.setString(1, playerTime.getName()); pstm.setInt(2, playerTime.getTime()); pstm.execute(); pstm.close();DatabaseSetting, konštantaQUERY_ADD_BEST_TIME):INSERT INTO player_time (name, best_time) VALUES (?, ?)
- Uzatvorenie spojenia na databázu connection.close().
- 
                           Ošetrenie vzniku výnimky v prípade práce s databázovým serverom. Pri vzniku výnimky nech je na konzolu
                           vypísaný text obsahujúci aj opis chyby poskytnutý ovládačom databázového systému. Text bude v tvare
                           (premenná e je objektom výnimky):
                           
                           "Exception occured during saving high score to database: " + e.getMessage()
 Úloha: V triedeRealizácia metódy bude pozostávať z nasledujúcich krokov:BestTimesdefinujte súkromnú metóduvoid selectFromDB(), ktorá zabezpečí vytvorenie objektov typuPlayerTimes údajmi získanými z databázy a ich uloženie do zoznamu v členskej premennejplayerTimes.- 
                           Získanie objektu typu Connection, ktorý reprezentuje spojenie na databázový server.Class.forName(DatabaseSetting.DRIVER_CLASS); Connection connection = DriverManager.getConnection(DatabaseSetting.URL, DatabaseSetting.USER, DatabaseSetting.PASSWORD);
- 
                           Vykonanie SQL príkazu SELECTnad databázovým serverom. Výsledkom je objekt typuResultSetumožňujúci prechod v zozname získaných záznamov z databázy. Realizácia bude nasledujúca:
 SQL príkaz pre získanie mien a časov hráčov je nasledovný (triedaStatement stm = connection.createStatement(); ResultSet rs = stm.executeQuery(DatabaseSetting.QUERY_SELECT_BEST_TIMES);DatabaseSetting, konštantaQUERY_SELECT_BEST_TIMES):SELECT name, best_time FROM player_time
- 
                           Vymazanie zoznamu objektov z členskej premennej playerTimespoužitím metódyclear(), aby sme mohli aktualizovať tento zoznam aktuálnymi údajmi.
- 
                           Spracovanie získaných záznamov z databázového servera. Pre každý získaný záznam z databázy bude
                           vytvorený objekt typu PlayerTimes nastavením príslušných údajov. Tento objekt bude pridaný do vytváraného zoznamuplayerTimes.while(rs.next()) { PlayerTime pt = new PlayerTime(rs.getString(1), rs.getInt(2)); playerTimes.add(pt); } stm.close();
- 
                           Uzatvorenie spojenia na databázu connection.close().
- 
                           Ošetrenie vzniku výnimky v prípade práce s databázovým serverom. Pri vzniku výnimky nech je na konzolu
                           vypísaný text obsahujúci aj opis chyby poskytnutý ovládačom databázového servera. Text bude v tvare
                           (premenná eje objektom výnimky):"Exception occured during loading high score from database: " + e.getMessage()
- 
                           Zotrieďte údaje získané z databázy aby zodpovedali poradiu hráčov. Použite statickú metódu
                           sort(List list)triedyjava.util.Collections.
 Úloha: Upravte metóduvoid addPlayerTime(String name, int time)tak, aby bol vytvorený objekt typuPlayerTimeuložený do databázy použitím metódyvoid insertToDB(PlayerTime playerTime).Úloha: Upravte metóduString toString()tak, aby sa aktualizoval zoznam časov hráčovPlayerTimev členskej premennejplayerTimespodľa stavu v databáze použitím metódyvoid selectFromDB().
- 
                           Vytvorenie spojenia na databázový server so získaním objektu typu 
- 
                  Posledným krokom pre overenie realizovaných úloh je konfigurácia databázového servera Derby a nastavenie a vytvorenie databázy. Databázový systém Derby je súčasťou inštalácie JDK 6.Úloha: Nakonfigurujte databázový systém Derby v prostredí Netbeans.Zvoľte v menu „Window > Services”. V strome služieb zvoľte uzol „Java DB”. Otvorte kontextové menu a skontrolujte nastavenie pre DB (položka „Properties”). Nastavte adresár inštalácie Derby a adresár kde budú ukladané databázové súbory.Úloha: Vytvorte databázu pre hru Minesweeper.Vytvorte databázu zvolením položky „Create Database” v kontextovom menu. Napíšte názov databázy, meno používateľa, heslo používateľa.Úloha: Spustite databázový systém.Zvoľte v kontextovom menu „Start Server” ak sa tak už nestalo.Úloha: Pridajte do classpath ovládač pre prístup k databáze.Zvoľte v kontextovom menu nad projektom v záložke „Projects” položku „Properties” a v dialógu „Libraries > Run” pridajte jar súbor s ovládačomderbyclient.jar, ktorý sa nachádza v inštalácii databázového servera Derby.Úloha: Spustite hru Minesweeper a otestujte implementovanú funkčnosť.
Zdroje
- Zdrojové kódy:
Doplňujúce úlohy
Úloha:
                     
                  Rozšírte ukladanie časov hráčov o úroveň, v ktorej bol výsledok dosiahnutý
                  (
            BEGINNER, INTERMEDIATE, EXPERT).
                  Modifikujte triedu BestTimes ako aj databázovú tabuľku player_time.
                  
               






DatabaseSetting.