Gali_db
Celý Wrapper je rozdělen na 4 části a vtomto tutoriálu si povíme o tom základním konkrétně o třídě Database. Instance databázových tříd se v Gali_db netvoří přímo klíčovým slovem new, ale používa se tzv. DBContainer. Tento kontejner obsahuje včechny 4 části Wrapperu a umožnuje se mezi nimi přepojovat. Změnu databáze si ukážeme na konci tutoriálu. Ještě než začnete psát kódy, prčtěte si prosím dokumentaci třídy Database. Ješte si nezapomeňte přidat MYSQL JDBC Driver.
Včechen kód musí být obalen v bloku try a v bloku catch musí být uvedený druh vyjímky, konkrétně SQLException.
1.krok - vytvoření Kontejneru
DBContainer container = new DBContainer();
2.krok - vytvoření konkrétního typu Databáze
DatabaseInterface database = container.selectDatabase("database").createDatabase("osoby", "root", "");
v metodě selectDatabase je vybrána základní databáze a v metodě createDatabase jsou uvedena přihlašovací údaje k databázi. Databáze - osoby, nick - root, heslo - žádné. Samozřejmě zde musíte úvést své přihlašovací údaju, které se stěmito údaji mohou lišit.
Základní funkce Wrapperu
Je to velmi jednoduché v následujícim příkladě je uvedeno jak přidat, odebrat, přepsat uživatele v databázi a jak jej z tabulky získat.
DBContainer container = new DBContainer();
DatabaseInterface database = container.selectDatabase("database").createDatabase("osoby", "root", "");
//vložení nového uživatele id=22, jmeno=gali, vek=43, jazyk=php
Object[] firstParams = {22, "Galí", 43, "PHP"};
int uspech1 = database.insert("osoby", firstParams);
System.out.println("Uložení uživatele = "+uspech1);
//smazání uživatele jehož jméno = gali
Object[] params2 = {"Galí"};
int uspech2 = database.delete("osoby", "jmeno = ?", params2);
System.out.println("Smazání uživatele Gali = "+uspech2);
//sloupce které se mají přepsat
String[] columns = {"jmeno","vek","jazyk"};
//údaje nového uživatele
Object[] params = {"Galileo", 18, "Java", 6};
int uspech4 = database.update("osoby", columns, "id = ?", params);
System.out.println("Přepsání uživate = "+uspech4);
//sloupce které získáme z tabulky
String[] columns3 = {"jmeno","jazyk"};
Object[] params3 = {"Java"};
//vyber uživatele jehož programovací jazyk = Java
ResultSet rs = database.select("osoby", columns3, "jazyk = ?", params3);
while(rs.next()){
System.out.println(rs.getString("jmeno")+" - "+rs.getString("jazyk"));
}
} catch (SQLException ex) {
System.out.println("error - "+ex.getMessage());
}*/
Všechny parametry se musí předávat jako pole. Může to být Object[] , nebo String[].
Výběr dat třída Criteria
Pro pohodlnější získávání dat z databázové tabulky se dá použít třída Criteria, s její pomoci lze jednoduše sestavit i pokročilý sql dotaz. Ukážeme si několik příkladů, ve kterých budou výhody této třídy jasně znázorněny. Ve 2 a 3 príkladě si dále ukážeme ješte pomocnou třídu Requirement, díky které se dají vytvořit i ty nejsložitější dotazy.
konstruktor třídy:
- new Criteria(DatabaseInterface database, String table);
Metody třídy
- add(String requirement); - použije se při přidání první podmínky
- add(String requirement, String type); - type se používá až od druhé podminky.
- or(String requirement1, String requirement2); - přídá do dotazu podmínku or
- and(String requirement1, String requirement2); - přidá do dotazu podmínku and
Pouze připomenu že:
- AND - podmínky se musí shodovat. musí platit i první i druhá podmínka
- OR - jedna z podmínek se musí vypleni. Bud první, nebo druha
1.příklad - výběr uživatelů, kteří mají id větší než 2 a jejich programovacím jazykem je java.
DBContainer container = new DBContainer();
DatabaseInterface database = container.selectDatabase("database").createDatabase("osoby", "root", "");
Object[] params = {2, "Java"};
Criteria criteria2 = new Criteria(database, "osoby");
//2 podmínky
criteria2.add("id > ?").add("jazyk = ?", "and");
//potvrzení
ResultSet rs = criteria2.commit(params);
System.out.println(criteria2.getQuery());
while(rs.next()){
System.out.println(rs.getString("jmeno")+" - "+rs.getString("jazyk"));
}
Kdyby jste si chtěli svůj SQl dotaz oveřit, tak ho můžete vypsat
System.out.println(criteria2.getQuery());
2.příklad - použítí třídy Requirement(výběr uživatele který má více něž 6 let a zároveň méně než 12 let a který programuje v Javě)
Object[] params2 = {6, 12, "Java"};
Criteria criteria3 = new Criteria(database, "osoby");
criteria3.and(Requirement.and("vek > ?", "vek < ?"), "jazyk = ?");
ResultSet rs2 = criteria3.commit(params2);
while(rs2.next()){
System.out.println(rs2.getString("jmeno")+" - "+rs2.getString("jazyk"));
Třída Requirement je statická a dá se tedy jednoduše použít v kritériích, aniž by jsme museli vytvářet instance. Výhoda spočívá v tom, že namísto zavolání 3 metod add třídy Criteria, tak ji zavoláme jen jednou a vylepšíme ji za pomoci metody and ve třídě Requirement. Některým možná napoví více vygenerovaný SQL dotaz:
SELECT * FROM osoby WHERE vek > 6 AND vek < 12 AND jazyk = `java`
Je jasně, že tak složité funkce nemusí každému vyhovovat, ale věřte, že pokud si na to zvyknete a pochopíte ten princip, bude to pro vás to nejlepší. Pokud je to pro vád moc složité tak Třídu Requirement nepoužívejte.