IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

7. diel - Wicket - Databáza

V tejto časti nadviažeme na predchádzajúce lekciu, kedy sme vytvorili kontaktný formulár. Dáta z formulára budeme ukladať do databázy (v našom prípade PostgreSQL). Pre záujemcov je práca s PostgreSQL podrobnejšie popísaná v sekcii PostgreSQL, my si tu vysvetlíme len minimum potrebné na vytvorenie nášho projektu.

PostgreSQL

Stiahnutie PostgreSQL vrátane pgAdmin (grafické rozhranie): http://www.enterprisedb.com/...g/pgdownload

Inštalácia PostgreSQL je jednoduchá a užívateľsky prívetivá. Spustenie instaleru -> spustí sa setup Microsoft Visual C ++ 2013 (ak nemáte naistalováno). Nasleduje setup PostgreSQL -> nastavenie Installation Directory -> Data Directory -> Password -> Port (defaltně 5432) -> Advanced Options - výber locale -> Ready to Install. Ďalej sa spustí Stack Builder 3.xx pre inštaláciu dodatočného softvéru. Tu nie je potrebné vyberať nič, všetko potrebné je už naistalováno.

Spoločne s postgres sa naistaloval aj pgAdmin, čo je grafické užívateľské rozhranie pre administráciu databázy.

Inštalácia obsahuje jednu databázu (postges) a jednu prihlasovacie rolu (postgres).

Apache Wicket

Kliknutím na ikonu SQL sa dostanete do Query view, v ktorom je možné zadávať SQL príkazy (F5 vykoná všetky príkazy, ďalšou možnosťou je označiť príkaz a kliknú na ikonu so zelenou šípkou).

Apache Wicket

Dáta z tabuľky možno získať pomocou selektov v Query view, kliknutím pravého tlačidla myši na tabuľke v Object browsera a voľby View dáta, prípadne označením tabuľky v Object browsera a klávesové skratky Ctrl + D.

Apache Wicket
Apache Wicket
Apache Wicket

DAO návrhový vzor

DAO (Data Access Object) predstavuje rozhranie (interface) pre prístup k databáze. V DAO rozhrania sú definované metódy pre prácu s databázou. Ďalej sa vytvorí implementácia tohto rozhrania, ktorá implementuje danej metódy. Objekty, ktoré potrebujú pracovať s databázou, si vytvoria inštanciu DAO a používajú špecifikované metódy (napr. Saved (), getAllData (), getById (), atď ...). Všetka logika pre prácu s databázou sa nachádza v DAO. Triedy používajúce databázu (prostredníctvom DAO) nevie nič o tom, ako je práca (interakcia) s databázou implementovaná. Iba vytvorí inštanciu DAO a používajú metódy. V prípade zmeny týkajúce sa databázy (napr. Zmena databázy) nedochádza k zmene vlastného kódu aplikácie, len sa zmení DAO implementácie

Ďalej sa potom vytvorí trieda / triedy ktorých inštancie budú predstavovať objekt, ktorý budeme v databáze ukladať, načítať či meniť. V našom prípade budeme pracovať s komentárom, a preto vytvoríme triedu Comment.

Comment.java

import java.sql.Date;
import java.sql.Timestamp;

public class Comment {

    private Timestamp createdTime;
    private String email;
    private String textOfComment;

    public Timestamp getCreatedTime() {
        return createdTime;
    }
    public void setCreatedTime(Timestamp createdTime) {
        this.createdTime = createdTime;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getTextOfComment() {
        return textOfComment;
    }
    public void setTextOfComment(String textOfCcomment) {
        this.textOfComment = textOfCcomment;
    }
}

Iba drobné upozornenie. Date a Timestamp importujeme z balíčka java.sql.

CommentDao.java

import java.util.List;

public interface CommentDao {

    public void saveComment(Comment comment);
    public List<Comment> getAllComments();
}

Pre prácu s databázou použijeme JDBC.

"Java DataBase Connectivity (JDBC) je API v programovacom jazyku Java, ktoré definuje jednotné rozhranie pre prístup k relačnom databázam [1]. Ide o medzivrstvu medzi Java aplikácií a samotnú komunikáciou s určitou databázou. JDBC umožňuje aplikáciu rovnako pristupovať k rôznym databázam. líšia sa iba JDBC driver, ktorý poskytuje tvorca databázového servera. " Wikipédie

CommentDaoImpl.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class CommentDaoImpl implements CommentDao {
    private final String POSTGRES = "jdbc:postgresql://localhost/nazev_databáze?user=uživatelské_jméno&password=heslo";

    static {
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void saveComment(Comment comment) {
        try (Connection con = DriverManager.getConnection(POSTGRES)) {
            PreparedStatement ps = con.prepareStatement(
                    "insert into comment (created_time, email, text_of_comment) values (?, ?, ?)"
                    );
            ps.setTimestamp(1, comment.getCreatedTime());
            ps.setString(2, comment.getEmail());
            ps.setString(3, comment.getTextOfComment());
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public List<Comment> getAllComments() {
        List<Comment> comments = new ArrayList<>();
        try (Connection con = DriverManager.getConnection(POSTGRES)) {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("select id_comment, created_time, email, text_of_comment from comment");
            while (rs.next()) {
                Comment comment = new Comment();
                comment.setCreatedTime(rs.getTimestamp("created_time"));
                comment.setEmail(rs.getString("email"));
                comment.setTextOfComment(rs.getString("text_of_comment"));
                comments.add(comment);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return comments;
    }
}

String Postgres obsahuje reťazec použitý pre pripojenie k databáze (pre získanie spojenia - connection).

Tento riadok načíta triedu ovládača.

Class.forName("org.postgresql.Driver");

Ďalej je potrebné pridať postgresql jdbc driver ( http://jdbc.postgresql.org/download.html) do lib zložky aplikačného servera (... \ apache-tomcat-7.0.55 \ lib), a tiež do pom.xml pridať závislosť ( dependency) pre postgresql jdbc driver.

<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.1-901-1.jdbc4</version>
</dependency>

Tiež je potrebné v databáze vytvoriť tabuľku comment.

create table comment (
    id_comment serial not null,
    created_time timestamp not null,
    email character varying (50),
    text_of_comment character varying,
    constraint comment_pk primary key (id_comment)
);

Teraz otestujeme pripojenie databázy (naši DAO implementáciu) pomocou JUnit testu. V src / test / java vytvoríme balíček cz.mujweb.database a testovacie triedu TestDatabase (pravým tlačidlom na balíček -> New -> Other -> JUnit Test Case -> Next -> ako meno zadajte TestDatabase -> Finish). Vytvorí sa nám trieda s vygenerovanú metódou test ().

@Test
public void test() {
    fail("Not yet implemented");
}

Ak teraz test spustíme (pravým tlačidlom na triedu -> Run As -> JUnit Test), objaví sa nám nová záložka JUnit.

Apache Wicket

Test nám zlyhá (fail). To nie je nič prekvapujúce, pretože je tak napísaný. Vyskúšali sme si však, že testovanie pomocou JUnit v našom projekte funguje. Možno vás prekvapilo, ako je možné, že nedošlo pri použití JUnit k chybe, keď sme túto knižnicu nepridávali do závislostí v pom.xml. Ak sa do súboru pom.xml pozriete, zistíte, že JUnit závislosť tam už je pridaná.

Vygenerovanú metódu public void test () môžeme teraz zmazať. Vytvoríme si metódu vlastné.

TestDatabase.java

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.sql.Timestamp;
import java.util.List;

import org.junit.Test;

public class TestDatabase {

    @Test
    public void testCommentSaving() {
        // vytvoření nového komentáře
        Comment comment = new Comment();
        comment.setCreatedTime(new Timestamp(1_000_000_000L));
        comment.setEmail("[email protected]");
        comment.setTextOfComment("Text komentáře");

        // uložení komentáře do databáze
        CommentDao dao = new CommentDaoImpl();
        dao.saveComment(comment);

        // získání všech komentářů z databáze
        List<Comment> comments = dao.getAllComments();
        assertNotNull(comments);
        assertTrue(comments.size() > 0);

        Comment lastComment = comments.get(comments.size() - 1);
        assertTrue(lastComment.getCreatedTime().getTime() == 1_000_000_000L);
    }
}

Ak test spustíme teraz, mal by prejsť.

Apache Wicket

Tiež sa môžeme pozrieť do databázy, či je komentár skutočne uložený.

Apache Wicket

Ešte nám zostáva upraviť metódu onSubmit () tak, aby pri odoslaní formulára uložila dáta do databázy.

ContactForm.java

@Override
protected void onSubmit() {
    Comment comment = new Comment();
    comment.setCreatedTime(new Timestamp(new Date().getTime()));
    comment.setEmail(email);
    comment.setTextOfComment(text);

    CommentDao dao = new CommentDaoImpl();
    dao.saveComment(comment);

    setResponsePage(HomePage.class);
}

V prvej časti metódy vytvoríme inštanciu komentáre (Comment) a nasetujeme jej dáta získané z formulára (email, text). Do dátumu vytvorenia vložíme aktuálny čas.

new Date() // java.util.date, vytvoří aktuální čas
new Date().getTime() // vrátí aktuální čas jako počet milisekund
new Timestamp(aktuální_čas) // vytvoří nový java.sql.timestamp s aktuálním časem

V druhej časti metódy vytvoríme CommentDao objekt a zavoláme jeho metódu saveComment (). Na záver voláme metódu setResponsePage () a ako parametra jej odovzdáme triedu stránky, kam chceme, aby bol používateľ presmerovaný.

Apache Wicket
Apache Wicket
Apache Wicket

Priložený súbor obsahuje zdrojový kód vytvorené webové aplikácie.
Ďalšie zdroje:

 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 44x (30.52 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Wicket - Formulár a model
Všetky články v sekcii
Apache Wicket
Preskočiť článok
(neodporúčame)
Wicket - Validácia vstupu a opakovač
Článok pre vás napísal vita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity