Úvod do Apache Cayenne ORM
1. Prehľad
Apache Cayenne je knižnica s otvoreným zdrojovým kódom distribuovaná pod licenciou Apache, ktorá poskytuje funkcie ako nástroj na modelovanie, objektovo-relačné mapovanie aka ORM pre miestne operácie pretrvávania a služby vzdialenej komunikácie.
V nasledujúcich častiach sa dozvieme, ako interagovať s databázou MySQL pomocou servera Apache Cayenne ORM.
2. Maven závislosti
Ak chcete začať, stačí pridať nasledujúce závislosti, aby sme priniesli konektor Apache Cayenne a MySQL spolu s ovládačom JDBC na prístup k našim intro_cayenne databáza:
org.apache.cayenne cayenne-server 4.0.M5 mysql mysql-connector-java 5.1.44 runtime
Poďme nakonfigurovať doplnok Cayenne modelár, ktorý sa použije na návrh alebo nastavenie nášho mapovacieho súboru, ktorý slúži ako most medzi databázovou schémou a objektom Java:
org.apache.cayenne.plugins maven-cayenne-modeler-plugin 4.0.M5
Namiesto ručného vytvárania mapovacieho súboru XML (zriedka) sa odporúča používať modelár, čo je dosť pokročilý nástroj dodávaný s distribúciou Cayenne.
Je k dispozícii na stiahnutie z tohto archívu v závislosti od operačného systému, alebo stačí použiť cross-platformovú verziu (JAR) zahrnutú ako doplnok Maven hore.
Repozitár Maven Central hostí najnovšie verzie Apache Cayenne, jeho modelára, a MySQL Connector.
Ďalej postavme náš projekt pomocou inštalácia mvn a príkazom spustíme grafické rozhranie modelára mvn cayenne-modeler: spustiť ako výstup získate túto obrazovku:
3. Inštalácia
Aby Apache Cayenne vyhľadal správnu lokálnu databázu, stačí, aby sme jeho konfiguračný súbor vyplnili správnym ovládačom, adresou URL a používateľom v súbore. cayenne-project.xml nachádza sa v zdrojov adresár:
Tu vidíme, že:
- Lokálna databáza je pomenovaná intro_cayenne
- Ak to ešte nie je vytvorené, urobí to za nás Cayenne
- Pripojíme sa pomocou používateľského mena koreň a heslo koreň (zmeňte to podľa používateľov zaregistrovaných vo vašom systéme na správu databáz)
Vnútorne je to XMLPoolingDataSourceFactory zodpovedný za načítanie informácií o pripojení JDBC z prostriedku XML priradeného k DataNodeDescriptor.
Uvedomte si, že tieto parametre sú relatívne k systému správy databáz a ovládaču JDBC, pretože táto knižnica podporuje mnoho rôznych databáz.
Každá z nich má v tomto podrobnom zozname k dispozícii adaptér. Upozorňujeme, že úplná dokumentácia pre verziu 4.0 ešte nie je k dispozícii, preto si pozrite predchádzajúcu verziu tu.
4. Mapovanie a návrh databázy
4.1. Modelovanie
Teraz kliknime na ikonu „Otvorený projekt“, prejdite do priečinka zdrojov projektu a vyberte súbor cayenne-project.xml, modelár to ukáže:
Tu, máme na výber, či vytvoríme našu mapovaciu štruktúru z existujúcej databázyalebo postupovať ručne. Tento článok sa bude zaoberať tým, ktorý využíva modelár a existujúcu databázu, aby sa dostal do Cayenne a rýchlo vedel, ako to funguje.
Poďme sa pozrieť na naše intro_cayenne databáza, ktorá má a jedna k mnohým vzťah medzi dvoma tabuľkami, pretože autor môže publikovať alebo vlastniť veľa článkov:
- autor: id (PK) a názov
- článok: id (PK), názov, obsaha author_id (FK)
Teraz poďme k „Nástroje> Schéma databázy reengineera“, A všetky naše konfigurácie mapovania budeme mať vyplnené automaticky. Na obrazovke s výzvou stačí vyplniť konfiguráciu zdroja údajov, ktorá je k dispozícii tam v priečinku cayenne-project.xml súbor a stlačte pokračovať:
Na ďalšej obrazovke musíme nasledovne skontrolovať možnosť „Použiť primitívne typy Java“:
Musíme tiež zabezpečiť, aby com.baeldung.apachecayenne.perzistentné ako balík Java a uložte ho; uvidíme, že bol aktualizovaný konfiguračný súbor XML defaultPackage vlastnosť zodpovedajúca balíku Java:
V každom Objektívnosť musíme určiť balík pre podtriedy, ako je znázornené na nasledujúcom obrázku, a kliknúť na ikonu „Uložiť“ znova ikona:
Teraz „Nástroje> Generovať triedy“ menu, zvoľte „Štandardné trvalé objekty”Ako typ; a na „Triedy“ karta skontrolujte všetky triedy a stlačte „Generovať“.
Vráťme sa k zdrojovému kódu a zistíme, že naše perzistentné objekty boli úspešne vygenerované _Article.java a _Author.java.
Upozorňujeme, že všetky tieto konfigurácie sú uložené v súbore datamap.map.xml tiež sa nachádza v zdrojov priečinok.
4.2. Štruktúra mapovania
Vygenerovaný súbor mapovania XML, ktorý sa nachádza v priečinku prostriedkov, používa niektoré jedinečné značky súvisiace s Apache Cayenne:
- DataNode () - model databázy, jej obsah, všetky informácie potrebné na pripojenie k databáze (názov databázy, údaje o vodičovi a používateľovi)
- DataMap () - je to kontajner pretrvávajúcich entít s ich vzťahmi
- DbAttribute () - predstavuje stĺpec v databázovej tabuľke
- DbEntity () - model jednej databázovej tabuľky alebo zobrazenia, môže mať DbAttributes a vzťahy
- ObjEntity () - model jednej pretrvávajúcej triedy Java; vyrobené z ObjAttributes, ktoré zodpovedajú vlastnostiam triedy entít a ObjRelationships, čo sú vlastnosti, ktoré majú typ inej entity
- Možnosť vloženia () - model triedy Java, ktorá funguje ako vlastnosť ObjEntity, ale zodpovedá viacerým stĺpcom v databáze
- Postup () - zaregistrovať uloženú procedúru v databáze
- Dopyt() - model dotazu, ktorý sa používa na mapovanie dotazu v konfiguračnom súbore bez toho, aby sme nezabudli, že to môžeme urobiť aj v kóde
Tu sú všetky podrobnosti.
5. API Cayenne
Jediným zostávajúcim krokom je použitie Cayenne API na vykonávanie našich databázových operácií pomocou vygenerovaných tried s vedomím, že podtrieda našich pretrvávajúcich tried je iba osvedčeným postupom, ktorý sa neskôr použije na prispôsobenie modelu.
5.1. Vytvorenie objektu
Tu len uložíme Autor objekt a neskôr skontrolujte, či je v databáze iba jeden záznam tohto typu:
@Test public void whenInsert_thenWeGetOneRecordInTheDatabase () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); dlhé záznamy = ObjectSelect.dataRowQuery (Author.class) .selectCount (kontext); assertEquals (1, záznamy); }
5.2. Čítanie objektu
Po uložení Autor, iba ho vyberieme okrem iného prostredníctvom jednoduchého dotazu konkrétnej vlastnosti:
@Test public void whenInsert_andQueryByFirstName_thenWeGetTheAuthor () {Autor autor = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Autor expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontext); assertEquals ("Paul", expectAuthor.getName ()); }
5.3. Získanie všetkých záznamov triedy
Uložíme dvoch autorov a stiahneme kolekciu autorských objektov, aby sme skontrolovali, či sú uložení iba títo dvaja:
@Test public void whenInsert_andQueryAll_thenWeGetTwoAuthors () {Author firstAuthor = context.newObject (Author.class); firstAuthor.setName ("Paul"); Autor secondAuthor = context.newObject (Author.class); secondAuthor.setName ("Ludovic"); context.commitChanges (); Zoznam autorov = ObjectSelect .query (Author.class) .select (kontext); assertEquals (2, autorov.size ()); }
5.4. Aktualizácia objektu
Proces aktualizácie je tiež jednoduchý, ale pred úpravou jeho vlastností a jeho použitím v databáze musíme najskôr mať požadovaný objekt:
@Test public void whenUpdating_thenWeGetAnUpatedeAuthor () {Autor autor = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Autor expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontext); expectAuthor.setName ("Garcia"); context.commitChanges (); assertEquals (author.getName (), expectAuthor.getName ()); }
5.5. Pripojenie objektu
Článok môžeme priradiť autorovi:
@Test public void whenAttachingToArticle_thenTheRelationIsMade () {Autor autor = context.newObject (Author.class); author.setName ("Paul"); Article article = context.newObject (Article.class); article.setTitle ("Názov môjho príspevku"); article.setContent ("Obsah"); article.setAuthor (autor); context.commitChanges (); Autor expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Smith")) .selectOne (kontext); Article expectArticle = (expectAuthor.getArticles ()). Get (0); assertEquals (article.getTitle (), expectArticle.getTitle ()); }
5.6. Vymazanie objektu
Vymazanie uloženého objektu ho úplne odstráni z databázy, potom uvidíme nulový ako výsledok dotazu:
@Test public void whenDeleting_thenWeLostHisDetails () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Autor savedAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontext); if (savedAuthor! = null) {context.deleteObjects (autor); context.commitChanges (); } Autor expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontext); assertNull (expectAuthor); }
5.7. Odstrániť všetky záznamy z triedy
Je tiež možné zrušiť všetky záznamy tabuľky pomocouSQLTemplate, tu to robíme po každej testovacej metóde, aby sme pred spustením každého testu mali vždy databázu void:
@After public void deleteAllRecords () {SQLTemplate deleteArticles = new SQLTemplate (Article.class, "delete from article"); SQLTemplate deleteAuthors = nový SQLTemplate (Author.class, "vymazať od autora"); context.performGenericQuery (deleteArticles); context.performGenericQuery (deleteAuthors); }
6. Záver
V tomto tutoriáli sme sa zamerali na použitie Apache Cayenne ORM na ľahké preukázanie toho, ako robiť operácie CRUD pomocou a jedna k mnohým vzťah.
Zdrojový kód tohto článku nájdete ako vždy na serveri GitHub.