Bevezetés a Jinqbe tavasszal

1. Bemutatkozás

A Jinq intuitív és praktikus megközelítést kínál az adatbázisok lekérdezéséhez a Java-ban. Ebben az oktatóanyagban felfedezzük hogyan konfigurálhat egy tavaszi projektet a Jinq használatához és néhány jellemzőjét egyszerű példákkal illusztrálva.

2. Maven-függőségek

Hozzá kell adnunk a Jinq-függőséget a pom.xml fájl:

 org.jinq jinq-jpa 1.8.22 

Tavaszra hozzáadjuk a tavaszi ORM függőséget a pom.xml fájl:

 org.springframework spring-orm 5.2.5.KÖZLEMÉNY 

Végül a teszteléshez egy H2 memóriában lévő adatbázist fogunk használni, ezért adjuk hozzá ezt a függőséget is spring-boot-starter-data-jpa a pom.xml fájlba:

 com.h2database h2 1.4.200 org.springframework.boot spring-boot-starter-data-jpa 2.2.6. KÖZLEMÉNY 

3. Jinq megértése

A Jinq segít nekünk könnyebb és olvashatóbb adatbázis-lekérdezéseket írni egy folyékony API-val, amely belsőleg alapul a Java Stream API.

Lássunk egy példát, ahol szűrjük az autókat modell szerint:

jinqDataProvider.streamAll (entitásManager, Autóosztály) .hol (c -> c.getModel (). egyenlő (modell)) .toList ();

A Jinq hatékony módon lefordítja a fenti kódrészletet SQL lekérdezéssé, így a végső lekérdezés ebben a példában a következő lenne:

válassza a c. * -t a c autóból, ahol c.modell =?

Mivel nem egyszerű szöveget használunk a lekérdezések írására, hanem egy típusbiztonságos API-t használunk, ez a megközelítés kevésbé hajlamos a hibákra.

Ráadásul a Jinq célja a gyorsabb fejlesztés lehetővé tétele általános, könnyen olvasható kifejezések használatával.

Ennek ellenére bizonyos korlátai vannak az alkalmazható típusok és műveletek számában, amint ezt a későbbiekben láthatjuk.

3.1. Korlátozások

A Jinq csak a JPA alaptípusait és az SQL függvények konkrét listáját támogatja. Úgy működik, hogy a lambda műveleteket natív SQL lekérdezéssé alakítja át, az összes objektumot és metódust JPA adattípussá és SQL függvényekké leképezve.

Ezért nem várhatjuk el, hogy az eszköz lefordítson minden egyéni típust vagy egy típus összes módszerét.

3.2. Támogatott adattípusok

Lássuk a támogatott adattípusokat és módszereket:

  • Húregyenlő (), összehasonlítani() csak módszerek
  • Primitív adattípusok - számtani műveletek
  • Enums és egyéni osztályok - csak az == és a! = műveleteket támogatja
  • java.util.Collection - tartalmaz ()
  • Dátum API - egyenlő (), előtt(), utána() csak módszerek

Megjegyzés: ha a Java objektumból az adatbázis objektummá történő átalakítást testre akartuk szabni, regisztrálnunk kell egy AttributeConverter a Jinq-ben.

4. Jinq integrálása a tavasszal

Jinqnek szüksége van egy EntityManager például a perzisztencia-kontextus megszerzéséhez. Ebben az oktatóanyagban egy egyszerű megközelítést mutatunk be a Spring-szel, hogy a Jinq működjön együtt a EntityManager Hibernate nyújtotta.

4.1. Adattár interfész

Spring az adattárak fogalmát használja az entitások kezelésére. Nézzük meg a mi CarRepository interfész, ahol van módszerünk a Autó egy adott modell esetében:

nyilvános felület CarRepository {Opcionális findByModel (String modell); }

4.2. Absztrakt alaptár

Következő, szükségünk lesz egy alaptárra az összes Jinq képesség biztosítása:

public abstract class BaseJinqRepositoryImpl {@Autowired private JinqJPAStreamProvider jinqDataProvider; @PersistenceContext privát EntityManager entitásManager; védett absztrakt Class entityType (); public JPAJinqStream stream () {return streamOf (entityType ()); } védett JPAJinqStream streamOf (Class clazz) {return jinqDataProvider.streamAll (entitásManager, clazz); }}

4.3. A tárház megvalósítása

A Jinq-hez csak egy kell EntityManager példány és az entitás típusa osztály.

Lássuk a Autó lerakat megvalósítása az imént definiált Jinq-alaptárunk segítségével:

@Repository public class A CarRepositoryImpl kiterjeszti a BaseJinqRepositoryImpl megvalósítja a CarRepository {@Orride public Opcionális findByModel (String modell) {return stream () .where (c -> c.getModel (). Egyenlő (modell)) .findFirst (); } @Orride védett Class entityType () {return Car.class; }}

4.4. A kábelezés JinqJPAStreamProvider

Annak érdekében, hogy a JinqJPAStreamProvider például megtesszük adja hozzá a Jinq szolgáltató konfigurációját:

@Configuration public class JinqProviderConfiguration {@Bean @Autowired JinqJPAStreamProvider jinqProvider (EntityManagerFactory emf) {return new JinqJPAStreamProvider (emf); }}

4.5. A tavaszi alkalmazás konfigurálása

Az utolsó lépés az konfigurálja a Spring alkalmazást a hibernálás és a Jinq konfiguráció segítségével. Referenciaként lásd: alkalmazás.tulajdonságok fájl, amelyben a memóriában lévő H2 példányt használjuk adatbázisként:

spring.datasource.url = jdbc: h2: ~ / jinq spring.datasource.username = sa spring.datasource.password = spring.jpa.hibernate.ddl-auto = create-drop

5. Lekérdezés útmutató

A Jinq számos intuitív lehetőséget kínál a végső SQL lekérdezés testreszabására válassza ki, hol,csatlakozik és még sok más. Ne feledje, hogy ezeknek ugyanazok a korlátozásai vannak, amelyeket fentebb már bevezettünk.

5.1. Hol

A hol záradék lehetővé teszi több szűrő alkalmazását egy adatgyűjtéshez.

A következő példában az autókat modell és leírás szerint szeretnénk szűrni:

stream () .where (c -> c.getModel (). egyenlő (modell) && c.getDescription (). tartalmaz (desc)) .toList ();

És ezt az SQL-t fordítja Jinq:

válassza a c.modellt, c.leírást a c autóból, ahol c.model =? és keresse meg (?, c.leírás)> 0

5.2. Válassza a lehetőséget

Abban az esetben, ha csak néhány oszlopot / mezőt akarunk beolvasni az adatbázisból, akkor a válassza kikötés.

Több érték feltérképezése érdekében a Jinq számos értéket ad meg Tuple osztályok legfeljebb nyolc értékkel:

stream () .select (c -> új Tuple3 (c.getModel (), c.getYear (), c.getEngine ())) .toList ()

És a lefordított SQL:

válassza a c modellt, c. évet, c. motort az autóból c

5.3. Csatlakozik

A Jinq képes megoldani egy-egy és sok-sok kapcsolatot ha az entitások megfelelően vannak összekapcsolva.

Például, ha hozzáadjuk a gyártó entitást Autó:

@Entity (name = "CAR") public class Car {// ... @OneToOne @JoinColumn (name = "name") public Manufacturer getManufacturer () {return gyártó; }}

És a Gyártó entitás a Autós:

@Entity (name = "GYÁRTÓ") public class Gyártó {// ... @OneToMany (mappedBy = "model") public List getCars () {return cars; }}

Most már megszerezhetjük a Gyártó egy adott modell esetében:

Opcionális gyártó = stream () .where (c -> c.getModel (). Egyenlő (modell)) .select (c -> c.getManufacturer ()) .findFirst ();

A várakozásoknak megfelelően A Jinq egy belső csatlakozási SQL záradékot fog használni ebben a forgatókönyvben:

válassza ki az m.nevet, az m.várost az autóból c belső csatlakozás gyártója m a c.név = m.név ahol c.modell =?

Abban az esetben, ha jobban ellenőriznünk kell a csatlakozik záradékokat annak érdekében, hogy az entitások felett bonyolultabb kapcsolatokat valósítsunk meg, mint a sok a sokhoz viszonyítást, használhatjuk a csatlakozik módszer:

Lista list = streamOf (Gyártó.osztály) .csatlakozzon (m -> JinqStream.from (m.getCars ())) .toList ()

Végül használhatunk egy bal külső csatlakozási SQL záradékot a leftOuterJoin módszer helyett csatlakozik módszer.

5.4. Összesítések

Az eddig bemutatott összes példa a toList vagy a findFirst módszerek - a lekérdezésünk végeredményének visszaküldése a Jinq-ben.

Ezen módszerek mellett az eredmények összesítéséhez más módszerekhez is hozzáférünk.

Használjuk például a számol módszer, amellyel megkapjuk az adatbázisunkban szereplő konkrét modellek összes autójának számát:

long total = folyam () .hol (c -> c.getModel (). egyenlő (modell)) .szám ()

És a végső SQL a számol SQL módszer a várakozásoknak megfelelően:

válassza ki a count (c.model) értéket a c autóból, ahol c.model =?

A Jinq olyan összesítési módszereket is kínál, mint például összeg, átlagos, min, max, és a a különböző összesítések kombinálásának lehetősége.

5.5. Lapszámozás

Abban az esetben, ha tételenként szeretnénk olvasni az adatokat, használhatjuk a határ és kihagy mód.

Lássunk egy példát, ahol ki akarjuk hagyni az első 10 autót, és csak 20 elemet kapunk:

stream () .skip (10) .limit (20) .toList ()

És a létrehozott SQL:

válassza ki a c. * értéket az autó c korlátjából? ellentételezés?

6. Következtetés

Oda megyünk. Ebben a cikkben láttunk egy megközelítést a tavaszi alkalmazás felállításához a Jinq-el a Hibernate használatával (minimálisan).

Röviden áttekintettük a Jinq előnyeit és néhány főbb jellemzőjét.

Mint mindig, a források megtalálhatók a GitHubon.