Úvod do ORMLite

1. Prehľad

ORMLite je ľahká knižnica ORM pre aplikácie Java. Poskytuje štandardné funkcie nástroja ORM pre najbežnejšie prípady použitia, bez ďalšej zložitosti a réžie ostatných rámcov ORM.

Jeho hlavné vlastnosti sú:

  • definovanie tried entít pomocou anotácií Java
  • rozšíriteľný DAO triedy
  • a QueryBuilder trieda pre vytváranie zložitých otázok
  • generované triedy na vytváranie a rušenie databázových tabuliek
  • podpora transakcií
  • podpora vzťahov medzi entitami

V ďalších častiach sa pozrieme na to, ako môžeme nastaviť knižnicu, definovať triedy entít a vykonávať operácie s databázou pomocou knižnice.

2. Maven závislosti

Aby sme mohli začať používať ORMLite, musíme pridať ormlite-jdbc závislosť na našom pom.xml:

 com.j256.ormlite ormlite-jdbc 5.0 

V predvolenom nastavení to tiež prináša h2 závislosť. V našich príkladoch použijeme znak H2 pamäťová databáza, takže nepotrebujeme ďalší ovládač JDBC.

Ak chcete použiť inú databázu, budete potrebovať aj zodpovedajúcu závislosť.

3. Definovanie tried entít

Na nastavenie našich modelových tried na perzistenciu s ORMLite existujú dve základné anotácie, ktoré môžeme použiť:

  • @DatabaseTable pre triedu entít
  • @DatabaseField pre vlastnosti

Začnime definovaním a Knižnica subjekt s a názov pole a a libraryId pole, ktoré je tiež primárnym kľúčom:

@DatabaseTable (tableName = "knižnice") verejná trieda Knižnica {@DatabaseField (generovanéId = true) dlhá súkromná knižnica; @DatabaseField (canBeNull = false) súkromný názov reťazca; public Library () {} // štandardné getre, setre}

The @DatabaseTable anotácia má voliteľné tableName atribút, ktorý určuje názov tabuľky, ak sa nechceme spoliehať na predvolený názov triedy.

Pre každé pole, ktoré chceme zachovať ako stĺpec v databázovej tabuľke, musíme pridať znak @DatabaseField anotácia.

Vlastnosť, ktorá bude slúžiť ako primárny kľúč pre tabuľku, možno označiť ktoroukoľvek z nich id, generované ID alebo generovaná sekvencia atribúty. V našom príklade si vyberieme generatedId = true atribút, takže sa primárny kľúč automaticky zvýši.

Upozorňujeme tiež, že trieda musí mať minimálne konštruktor bez argumentov balíček-rozsah viditeľnosť.

Niekoľko ďalších známych atribútov, ktoré môžeme použiť na konfiguráciu polí, je názov stĺpca, Dátový typ, predvolená hodnota, canBeNull, jedinečný.

3.1. Použitím JPA Anotácie

Okrem anotácií špecifických pre ORMLite, môžeme tiež použiť Štýl JPA anotácie na definovanie našich entít.

Ekvivalent k Knižnica entita, ktorú sme definovali pred použitím JPA štandardné anotácie by boli:

@Entity public class LibraryJPA {@Id @GeneratedValue (strategy = GenerationType.IDENTITY) private long libraryId; @ Názov stĺpca súkromného reťazca; // štandardné getre, setre}

Aj keď ORMLite rozpoznáva tieto anotácie, stále musíme pridať javax.persistence-api závislosť na ich použití.

Celý zoznam podporovaných JPA anotácie je @Subjekt, @Id,@ Stĺpec,@GeneratedValue, @Jeden na jedného, @ManyToOne, @JoinColumn, @Verzia.

4. ConnectionSource

Ak chcete pracovať s definovanými objektmi, musíme založiť a ConnectionSource.

Na tento účel môžeme použiť JdbcConnectionSource trieda, ktorá vytvára jediné spojenie, alebo JdbcPooledConnectionSource čo predstavuje jednoduchý združený zdroj pripojenia:

JdbcPooledConnectionSource connectionSource = nový JdbcPooledConnectionSource ("jdbc: h2: mem: myDb"); // práca s connectionSource connectionSource.close ();

Možno použiť aj iný externý zdroj údajov s lepším výkonom, ktorý zabalíte do a DataSourceConnectionSource objekt.

5. TableUtils Trieda

Založený na ConnectionSource, môžeme použiť statické metódy z TableUtils triedy na vykonávanie operácií na schéme databázy:

  • createTable () - vytvoriť tabuľku na základe definície triedy entity alebo DatabaseTableConfig objekt
  • createTableIfNotExists () - podobne ako predchádzajúca metóda, s výnimkou toho, že tabuľku vytvorí, iba ak neexistuje; toto funguje iba v databázach, ktoré to podporujú
  • dropTable () - vymazať tabuľku
  • clearTable() - odstránenie údajov z tabuľky

Pozrime sa, ako môžeme využiť TableUtils vytvoriť tabuľku pre naše Knižnica trieda:

TableUtils.createTableIfNotExists (connectionSource, Library.class);

6. DAO Predmety

ORMLite obsahuje a DaoManager triedy, ktorá môže vytvárať DAO objekty pre nás s funkciou CRUD:

Dao libraryDao = DaoManager.createDao (connectionSource, Library.class);

The DaoManager neregeneruje triedu pre každé nasledujúce volanie createDao (), ale namiesto toho ho znova použije na lepší výkon.

Ďalej môžeme vykonávať operácie CRUD Knižnica objekty:

Knižnica knižnica = nová Knižnica (); library.setName ("Moja knižnica"); libraryDao.create (knižnica); Výsledok knižnice = libraryDao.queryForId (1L); library.setName ("Moja ďalšia knižnica"); libraryDao.update (knižnica); libraryDao.delete (knižnica);

The DAO je tiež iterátor, ktorý môže prechádzať cez všetky záznamy:

libraryDao.forEach (lib -> {System.out.println (lib.getName ());});

ORMLite však zatvorí podkladový príkaz SQL, iba ak sa slučka dostane až na koniec. Výnimka alebo vyhlásenie o vrátení môžu spôsobiť únik prostriedkov vo vašom kóde.

Z tohto dôvodu dokumentácia ORMLite odporúča, aby sme použili priamo iterátor:

try (CloseableWrappedIterable wrappedIterable = libraryDao.getWrappedIterable ()) {wrappedIterable.forEach (lib -> {System.out.println (lib.getName ());}); }

Týmto spôsobom môžeme uzavrieť iterátor pomocou a vyskúšajte zdroje alebo a konečne zablokovať a zabrániť úniku zdrojov.

6.1. Vlastná trieda DAO

Ak chceme rozšíriť správanie DAO poskytované objekty, môžeme vytvoriť nové rozhranie, ktoré rozširuje Dao typ:

verejné rozhranie LibraryDao rozširuje Dao {public List findByName (názov reťazca) hodí SQLException; }

Potom pridajme triedu, ktorá implementuje toto rozhranie a rozširuje BaseDaoImpl trieda:

public class LibraryDaoImpl rozširuje BaseDaoImpl implementuje LibraryDao {public LibraryDaoImpl (ConnectionSource connectionSource) hodí SQLException {super (connectionSource, Library.class); } @Override public List findByName (String name) throws SQLException {return super.queryForEq ("name", name); }}

Upozorňujeme, že musíme mať konštruktor tohto formulára.

Na záver použiť náš zvyk DAO, do triedy musíme pridať názov triedy Knižnica definícia triedy:

@DatabaseTable (tableName = "libraries", daoClass = LibraryDaoImpl.class) verejná trieda Knižnica {// ...}

To nám umožňuje používať DaoManager na vytvorenie inštancie našej vlastnej triedy:

LibraryDao customLibraryDao = DaoManager.createDao (connectionSource, Library.class);

Potom môžeme použiť všetky metódy zo štandardu DAO triedy, ako aj našu vlastnú metódu:

Knižnica knižnica = nová Knižnica (); library.setName ("Moja knižnica"); customLibraryDao.create (knižnica); assertEquals (1, customLibraryDao.findByName ("Moja knižnica"). size ());

7. Definovanie vzťahov medzi entitami

ORMLite používa pojem „cudzie“ objekty alebo kolekcie na definovanie vzťahov medzi entitami na pretrvávanie.

Poďme sa pozrieť na to, ako môžeme definovať jednotlivé typy polí.

7.1. Polia cudzích objektov

Môžeme vytvoriť jednosmerný vzájomný vzťah medzi dvoma triedami entít pomocou zahraničné = pravda atribút v poli s poznámkou @DatabaseField. Pole musí byť typu, ktorý je tiež pretrvávajúci v databáze.

Najskôr definujme novú triedu entít s názvom Adresa:

@DatabaseTable (tableName = "adresy") verejná trieda Adresa {@DatabaseField (generatedId = true) súkromný dlhý addressId; @DatabaseField (canBeNull = false) private String addressLine; // štandardné getre, setre}

Ďalej môžeme pridať pole typu Adresa k nášmu Knižnica trieda, ktorá je označená ako zahraničné:

@DatabaseTable (tableName = "libraries") verejná trieda Knižnica {// ... @DatabaseField (foreign = true, foreignAutoCreate = true, foreignAutoRefresh = true) adresa súkromnej adresy; // štandardné getre, setre}

Všimnite si, že sme tiež pridali ďalšie dva atribúty @DatabaseField anotácia: foreignAutoCreate a foreignAutoRefresh, obidve nastavené na pravda.

The foreignAutoCreate = true atribút znamená, že keď uložíme a Knižnica objekt s adresa pole, uloží sa tiež cudzí predmet, pokiaľ id nie je null a má generatedId = true atribút.

Keby sme nastavili foreignAutoCreate do nepravdivé, čo je predvolená hodnota, potom budeme musieť cudzí predmet pred uložením explicitne zachovať Knižnica objekt, ktorý na ňu odkazuje.

Podobne foreignAutoRefresh=pravda atribút určuje, že pri načítaní a Knižnica objekt, vyhľadá sa aj súvisiaci cudzí predmet. V opačnom prípade by sme to museli aktualizovať manuálne.

Pridajme nový Knižnica objekt s Adresa pole a zavolajte na libraryDao vytrvať v oboch:

Knižnica knižnica = nová Knižnica (); library.setName ("Moja knižnica"); library.setAddress (nová adresa ("Main Street č. 20")); Dao libraryDao = DaoManager.createDao (connectionSource, Library.class); libraryDao.create (knižnica);

Potom môžeme nazvať adresa Dao overiť, či Adresa bol tiež uložený:

Dao addressDao = DaoManager.createDao (connectionSource, Address.class); assertEquals (1, addressDao.queryForEq ("addressLine", "Main Street nr 20") .size ());

7.2. Zahraničné zbierky

Pre veľa strana vzťahu, môžeme použiť typy ForeignCollection alebo Zbierka s @ForeignCollectionField anotácia.

Vytvorme nový Kniha entitu, ako sú tie vyššie, a potom do vzťahu Knižnica trieda:

@DatabaseTable (tableName = "libraries") verejná trieda Knižnica {// ... @ForeignCollectionField (eager = false) súkromné ​​knihy ForeignCollection; // štandardné getre, setre}

Okrem toho je potrebné, aby sme pridali pole typu Knižnica v Kniha trieda:

@DatabaseTable verejná trieda Book {// ... @DatabaseField (foreign = true, foreignAutoRefresh = true) súkromná knižnica knižnice; // štandardné getre, setre}

The ForeignCollectionpridať () a odstrániť () metódy ktoré pracujú na záznamoch o type Kniha:

Knižnica knižnica = nová Knižnica (); library.setName ("Moja knižnica"); libraryDao.create (knižnica); libraryDao.refresh (knižnica); library.getBooks (). add (nová kniha ("1984"));

Tu sme vytvorili a knižnica objekt, potom pridal nový Kniha namietať proti kníh pole, ktoré ho tiež uchová do databázy.

Upozorňujeme, že pretože naša zbierka je označená ako lenivo nabitá (dychtivý = nepravdivý), musíme zavolať Obnoviť() metóda predtým, ako budete môcť používať pole knihy.

Vzťah môžeme vytvoriť aj nastavením hodnoty knižnica pole v Kniha trieda:

Book book = new Book ("It"); book.setLibrary (knižnica); bookDao.create (kniha);

Overiť, že oboje Kniha objekty sa pridajú do súboru knižnica môžeme použiť queryForEq () metóda na vyhľadanie všetkých Kniha záznamy s daným id_knižnice:

assertEquals (2, bookDao.queryForEq ("id_knižnice", knižnica). veľkosť ());

Tu je id_knižnice je predvolený názov stĺpca s cudzím kľúčom a primárny kľúč je odvodený z knižnica objekt.

8. QueryBuilder

Každý DAO možno použiť na získanie a QueryBuilder objekt, ktorý potom môžeme využiť na vytváranie výkonnejších dopytov.

Táto trieda obsahuje metódy, ktoré zodpovedajú bežným operáciám používaným v dotaze SQL, ako napríklad: selectColumns (), where (), groupBy (),having (), countOf (), different (), orderBy (), join ().

Pozrime sa na príklad toho, ako môžeme nájsť všetky položky Knižnica záznamy, ktoré majú viac ako jeden Kniha príslušného:

Zoznam knižníc = libraryDao.queryBuilder () .where () .in ("libraryId", bookDao.queryBuilder () .selectColumns ("library_id") .groupBy ("library_id") .having ("count (*)> 1") ) .dopyt();

9. Záver

V tomto článku sme videli, ako môžeme definovať entity pomocou ORMLite, ako aj hlavné vlastnosti knižnice, ktoré môžeme použiť na manipuláciu s objektmi a s nimi spojenými relačnými databázami.

Celý zdrojový kód príkladu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found