Početak rada s jOOQ

1. Uvod

U ovom uputstvu krenut ćemo u brzi obilazak pokretanja aplikacije s jOOQ (Java objektno orijentirani upit). Ova knjižnica generira Java klase na temelju tablica baze podataka i omogućuje nam stvaranje SQL upita sigurnih za tip putem svog tečnog API-ja.

Obuhvatit ćemo cjelokupno postavljanje, povezivanje baze podataka PostgreSQL i nekoliko primjera CRUD operacija.

2. Ovisnosti Mavena

Za knjižnicu jOOQ trebat će nam sljedeće tri ovisnosti o jOOQ:

 org.jooq jooq 3.13.4 org.jooq jooq-meta 3.13.4 org.jooq jooq-codegen 3.13.4 

Trebat će nam i jedna ovisnost za PostgreSQL upravljački program:

 org.postgresql postgresql 42.2.16 

3. Struktura baze podataka

Prije nego što započnemo, kreirajmo jednostavnu DB shemu za naše primjere. Koristit ćemo jednostavan Autor i an Članak odnos:

izraditi tablicu AUTOR (ID cijeli broj PRIMARNI KLJUČ, FIRST_NAME varchar (255), LAST_NAME varchar (255), AGE cijeli broj); izraditi tablicu ČLANAK (ID cijeli broj PRIMARNI KLJUČ, NASLOV varchar (255) nije null, OPIS varchar (255), AUTHOR_ID integer CONSTRAINT fk_author_id REFERENCE AUTOR);

4. Veza s bazom podataka

Sada, pogledajmo kako ćemo se povezati s našom bazom podataka.

Prvo, u bazu podataka moramo unijeti korisnika, lozinku i puni URL. Ova ćemo svojstva koristiti za stvaranje a Veza objekt pomoću DriverManager I je getConnection metoda:

Niz userName = "korisnik"; Lozinka niza = "pass"; Niz url = "jdbc: postgresql: // db_host: 5432 / baeldung"; Povezivanje conn = DriverManager.getConnection (url, korisničko ime, lozinka); 

Dalje, moramo stvoriti instancu DSLContext. Ovaj će objekt biti naša ulazna točka za jOOQ sučelja:

DSLContext context = DSL.using (conn, SQLDialect.POSTGRES);

U našem slučaju prolazimo POŠTARI dijalekt, ali malo je dostupnih poput H2, MySQL, SQLite i još mnogo toga.

5. Generiranje koda

Da bismo generirali Java klase za naše tablice baze podataka, trebat će nam sljedeće jooq-config.xml datoteka:

   org.postgresql.Driver jdbc: postgresql: // db_url: 5432 / baeldung_database korisničko ime lozinka org.jooq.codegen.JavaGenerator org.jooq.meta.postgres.PostgresDatabase public. * com.baeldung.jooq.modelu C: / projects / tutorials / jooq-examples / src / main / java 

Prilagođena konfiguracija zahtijeva promjene u odjeljak u koji smještamo vjerodajnice baze podataka i u odjeljak u kojem konfiguriramo naziv paketa i direktorij mjesta za klase koje ćemo generirati.

Da bismo izvršili alat za generiranje jOOQ koda, moramo pokrenuti sljedeći kôd:

GenerationTool.generate (Files.readString (Path.of ("jooq-config.xml")));

Po završetku generiranja dobit ćemo dvije sljedeće klase, svaka koja odgovara svojoj tablici baze podataka:

com.baeldung.model.generated.tables.Article; com.baeldung.model.generated.tables.Author;

6. CRUD Operacije

Sada, pogledajmo nekoliko osnovnih CRUD operacija koje možemo izvesti s jOOQ bibliotekom.

6.1. Stvaranje

Prvo, stvorimo novo Članak snimiti. Da bismo to učinili, moramo se pozvati na novi rekord metoda s odgovarajućom referencom tablice kao parametrom:

ArticleRecord članak = context.newRecord (Article.ARTICLE);

The Članak.ČLANAK varijabla je referentna instanca na ČLANAK tablica baze podataka. Automatski ga je stvorio jOOQ tijekom generiranja koda.

Dalje, možemo postaviti vrijednosti za sva potrebna svojstva:

article.setId (2); article.setTitle ("primjeri jOOQ-a"); article.setDescription ("Nekoliko primjera jOOQ CRUD operacija"); article.setAuthorId (1);

Napokon, moramo se pozvati na pohraniti metoda na zapisu za spremanje u bazu podataka:

article.store ();

6.2. Čitanje

Sada, da vidimo kako možemo čitati vrijednosti iz baze podataka. Kao primjer, odaberite sve autore:

Rezultati autora = context.select () .from (Author.AUTHOR) .fetch ();

Ovdje koristimo Odaberi metoda u kombinaciji s iz klauzula koja označava iz koje tablice želimo čitati. Pozivanje na donijeti metoda izvršava SQL upit i vraća generirani rezultat.

The Proizlaziti objekt provodi Iterativ sučelje, tako da je lako prelistati svaki element. I dok imamo pristup jednom zapisu, njegove parametre možemo dobiti pomoću getValue metoda s odgovarajućom referencom polja:

author.forEach (author -> {Integer id = author.getValue (Author.AUTHOR.ID); String firstName = author.getValue (Author.AUTHOR.FIRST_NAME); String lastName = author.getValue (Author.AUTHOR.LAST_NAME); Cijelo doba = autor.getValue (Autor.AUTHOR.AGE); System.out.printf ("Autor% s% s ima id:% d i dob:% d% n", ime, prezime, id, dob);} );

Upit za odabir možemo ograničiti na skup određenih polja. Dohvatimo samo ID-ove i naslove članaka:

Proizlaziti članci = context.select (Article.ARTICLE.ID, Article.ARTICLE.TITLE) .from (Autor.AUTHOR) .fetch ();

Također možemo odabrati jedan objekt pomoću fetchOne metoda. Parametri za ovaj su referenca tablice i uvjet koji odgovara odgovarajućem zapisu.

U našem slučaju, samo odaberite Autor s id-om jednakim 1:

AuthorRecord autor = context.fetchOne (Autor.AUTHOR, Autor.AUTHOR.ID.eq (1))

Ako se nijedan zapis ne podudara s uvjetom, fetchOne metoda će se vratiti null.

6.3. Ažuriranje

Da bismo ažurirali zadani zapis, možemo koristiti ažuriranje metoda iz DSLContext objekt u kombinaciji s a postavljen pozivi metode za svako polje koje moramo promijeniti. Nakon ovih izjava treba slijediti a gdje klauzula s odgovarajućim uvjetima podudaranja:

context.update (Author.AUTHOR) .set (Author.AUTHOR.FIRST_NAME, "David") .set (Author.AUTHOR.LAST_NAME, "Brown") .where (Author.AUTHOR.ID.eq (1)) .execute ();

Upit za ažuriranje pokrenut će se tek nakon što pozovemo izvršiti metoda. Kao povratnu vrijednost dobit ćemo cijeli broj jednak broju ažuriranih zapisa.

Također je moguće ažurirati već dohvaćeni zapis izvršenjem njegovog pohraniti metoda:

ArticleRecord članak = context.fetchOne (Article.ARTICLE, Article.ARTICLE.ID.eq (1)); article.setTitle ("Novi naslov članka"); article.store ();

The pohraniti metoda će se vratiti 1 ako je operacija bila uspješna ili 0 ako ažuriranje nije bilo potrebno. Na primjer, ništa se nije podudaralo sa stanjem.

6.4. Brisanje

Da bismo izbrisali zadani zapis, možemo koristiti izbrisati metoda iz DSLContext objekt. Uvjet brisanja treba proslijediti kao parametar u sljedećem gdje klauzula:

context.delete (Article.ARTICLE) .where (Article.ARTICLE.ID.eq (1)) .execute ();

Upit za brisanje pokrenut će se tek nakon što pozovemo izvršiti metoda. Kao povratnu vrijednost dobit ćemo cijeli broj jednak broju izbrisanih zapisa.

Također je moguće izbrisati već dohvaćeni zapis izvršenjem njegovog izbrisati metoda:

ArticleRecord articleRecord = context.fetchOne (Article.ARTICLE, Article.ARTICLE.ID.eq (1)); articleRecord.delete ();

The izbrisati metoda će se vratiti 1 ako je operacija bila uspješna ili 0 ako brisanje nije bilo potrebno. Primjerice, kada stanje nije bilo podudarno.

7. Zaključak

U ovom smo članku naučili kako konfigurirati i stvoriti jednostavnu CRUD aplikaciju pomoću okvira jOOQ. Kao i obično, sav izvorni kod dostupan je na GitHubu.