Ez a jegyzet '🦑 A Java legjava' kurzus 6. óráján készült kód felkommentelt változata. A workspace nyitott, szabadon nézhetőek a slidejai. Ebben a jegyzetben az ORM-mel ismerkedünk.
Ha egy részletesebb ORM jegyzetre vágysz, akkor ajánlom a Java abszolút kezdőknek 6) ORM, JPA, Hibernate és egyéb finomságok jegyzetet. Ha egy erősebb JSF-es példa érdekel, akkor a JavaServer Faces, a meg nem értett zseni. 3) Karbantartó alkalmazás készítése adatbázissal. jegyzetet tekintsd meg.
RobotRepository
package hu.roboto.data.repositories; import hu.roboto.data.enities.Robot; import java.util.Date; import java.util.List; public class RobotRepository extends AbstractRepository { public RobotRepository() { super(); } public void save(Robot robot) { sessionObj.beginTransaction(); //Mivel a képernyőn nem állítjuk be ezeket az adatokat, így itt beállítjuk őket. robot.setCreatedDate(new Date()); robot.setLastModifiedDate(new Date()); sessionObj.save(robot); sessionObj.getTransaction().commit(); } // a törlés hasonló módon történik, mint save, annyi, hogy az ORM objektum delete metódusát kell meghívni public void delete(Robot robot) { sessionObj.beginTransaction(); sessionObj.delete(robot); sessionObj.getTransaction().commit(); } public List<Robot> findAll() { //Többféle módon lehet lekérni az adatbázisban adatokat, most egy egyszerűt választunk, //melynek csak át kell adni a Robot.class-t és ezáltal tudja, melyik táblából kell kiolvasni az elemeket. // a sessionFactoryObjektumtól kérünk most egy stateless sessiont, és összeállítjuk a lekérdezést. // Ami egy select * lesz return sessionFactoryObj.openStatelessSession().createCriteria(Robot.class).list(); } }
RobotManagerMBean
package hu.roboto.mbean; import hu.roboto.data.enities.Robot; import hu.roboto.data.repositories.AbstractRepository; import hu.roboto.data.repositories.RobotRepository; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import java.util.ArrayList; import java.util.Date; import java.util.List; @ManagedBean(name = "robotManagerMBean") @ViewScoped public class RobotManagerMBean { private final String name = "Super Galaktikus T-4000 generális"; private String userName; //létrehozunk egy selectedRobot változót private Robot selectedRobot; private List<Robot> robotList; //kiteszük a robotRepository globális változóba private RobotRepository robotRepository; public RobotManagerMBean() { //inicialzáljuk a robotRepository-t robotRepository = new RobotRepository(); //inicialzáljuk a selectedRobot-ot selectedRobot = new Robot(); userName = "World"; robotList = new ArrayList(); //lekérjük az összes robot tábla tartalmát robotList = robotRepository.findAll(); //megnézzük üres-e a lista if (robotList.isEmpty()) { //ha üres, akkor beletöltünk 10 új robotot for (int i = 0; i < 10; i++) { Robot robi = new Robot(); robi.setName("Droideka" + i); robi.setType("T-4000"); robi.setCreatedDate(new Date()); robi.setLastModifiedDate(new Date()); robi.setWeapon("Anyukámnak a sodrófája"); robotList.add(robi); robotRepository.save(robi); } } } public void delete(Robot robot) { // a képernyővel kommunikáló Bean-nek a delete metódusa átadja a megfelelő robotot a repository-nak törlésre. robotRepository.delete(robot); //majd a táblázatunk tartalmát újra frissítjük robotList = robotRepository.findAll(); } public void save() { // a mentés egyszerűen végrehajtható, a selectedRobot-ot elmentjük, és egy új rekordot hozunk létre belőle robotRepository.save(selectedRobot); //újra frissítjük a robot lista tartalmát robotList = robotRepository.findAll(); //inicializálunk egy új robotot, hogy újakat használhassunk selectedRobot = new Robot(); } public List getRobotList() { return robotList; } public void setRobotList(List robotList) { this.robotList = robotList; } public String getName() { return name; } public String getUserName() { return userName; } public Robot getSelectedRobot() { return selectedRobot; } public void setSelectedRobot(Robot selectedRobot) { this.selectedRobot = selectedRobot; } public void setUserName(String userName) { this.userName = userName; } }
index.xhtml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" xml:lang="en" lang="en"> <h:head> <title>Robot manager</title> <h:outputStylesheet library="css" name="main.css"/> </h:head> <h:body> <h:form> <div> <h:outputText value="Ez a 'name' változó értéke: "/> <h:outputText styleClass="red" value="#{robotManagerMBean.name}"/> </div> <div> <h:outputText value="Ez a 'userName' változó értéke: "/> <h:outputText id="userNameOutput" styleClass="blue" value="#{robotManagerMBean.userName}"/> </div> <div> <h:inputText id="userNameInput" value="#{robotManagerMBean.userName}"/> <h:commandButton id="button" value="Nyomj meg"> <f:ajax execute="userNameInput" render="userNameOutput"/> </h:commandButton> </div> <div> <!-- kiírjuk a képernyőre, hogy Name az outputLabel segítségével, nevében is benne van hogy out, vagyis megjeleníti az adatokat --> <p:outputLabel value="Name"/> <!-- rákapcsoljuk (bind-oljuk) a selectedRobot.name field-jét az inputTextre, melyet így ha módosítunk és mentünk, akkor szerver oldalon a selectedRobot name értéke a mezőével fog megegyezni--> <p:inputText value="#{robotManagerMBean.selectedRobot.name}"/> <!-- hasonló dolgok mennek végbe a többi elemnél is--> <p:outputLabel value="Weapon"/> <p:inputText value="#{robotManagerMBean.selectedRobot.weapon}"/> <p:outputLabel value="Type"/> <p:inputText value="#{robotManagerMBean.selectedRobot.type}"/> <!-- a commandButton egy olyan JSF-es gomb, amelyet rá lehet kötni a MBean-re, egy akciófigyelőt, vagyis actionListener-t lehet rá kötni, vagyis gomb megnyomását figyelje, és ha alaki megnyomta, történjen meg egy mentés. Miután befejeződött, a szerver oldal feladata a gomb megnyomás után, az update="@form"-mal befrissítjük az egész jsf-es form tartalmát. Így befrissül a táblázat tartalma, amelyet ha minden igaz egy új elemmel gazdagítottunk, és üresek lesznek újra az űrlap mezői--> <p:commandButton value="Save" update="@form" actionListener="#{robotManagerMBean.save()}"/> <!-- egy azonosítót adtunk meg a táblázatnak, id="table" álltal--> <p:dataTable id="table" var="robot" value="#{robotManagerMBean.robotList}" rows="10" paginator="true" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15"> <p:column headerText="Id" sortBy="#{robot.id}" filterBy="#{robot.id}" sortable="true" filterable="true" filterMatchMode="contains"> <h:outputText value="#{robot.id}"/> </p:column> <p:column headerText="Name"> <h:outputText value="#{robot.name}"/> </p:column> <p:column headerText="Weapon"> <h:outputText value="#{robot.weapon}"/> </p:column> <p:column headerText="Functions"> <!-- Ennek a gombnak az actionListener-e a törlést hívja meg és eggyel kevesebb lesz táblázat tartalma az adatbázisban. Hogy a képernyőn is lássuk a változást, befrissítjük a táblázat tartalmát az id-ja segítségével update="table"--> <p:commandButton value="Delete" update="table" actionListener="#{robotManagerMBean.delete(robot)}"/> </p:column> </p:dataTable> </div> </h:form> </h:body> </html>
A kódot egészben innen le tudjátok tölteni: 6 Java óra felkommentelt kódok
Ha bármi kérdésed van, bátran keress meg.
java
JavaEE
JSF
PrimeFaces
orm
jpa
hibernate
sql