Kom godt i gang med jOOQ

1. Introduktion

I denne vejledning tager vi en hurtig rundvisning i at køre en applikation med jOOQ (Java Object Orientated Query). Dette bibliotek genererer Java-klasser baseret på databasetabellerne og lader os oprette typesikre SQL-forespørgsler gennem dets flydende API.

Vi dækker hele opsætningen, PostgreSQL-databaseforbindelse og et par eksempler på CRUD-operationer.

2. Maven-afhængigheder

For jOOQ-biblioteket har vi brug for følgende tre jOOQ-afhængigheder:

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

Vi har også brug for en afhængighed af PostgreSQL-driveren:

 org.postgresql postgresql 42.2.16 

3. Databasestruktur

Lad os oprette et simpelt DB-skema til vores eksempler, inden vi starter. Vi bruger et simpelt Forfatter og en Artikel forhold:

Opret tabel AUTHOR (ID-heltal PRIMÆR NØGLE, FIRST_NAME varchar (255), LAST_NAME varchar (255), AGE-heltal); Opret tabel ARTIKEL (ID-heltal PRIMÆR NØGLE, TITEL varchar (255) ikke null, BESKRIVELSE varchar (255), AUTHOR_ID heltal KONSTRAINT fk_author_id REFERENCES AUTHOR);

4. Databaseforbindelse

Lad os nu se på, hvordan vi opretter forbindelse til vores database.

For det første skal vi give brugeren, adgangskoden og en fuld URL til databasen. Vi bruger disse egenskaber til at oprette en Forbindelse objekt ved hjælp af DriverManager ogdet er getConnection metode:

String userName = "bruger"; Strengadgangskode = "pass"; String url = "jdbc: postgresql: // db_host: 5432 / baeldung"; Forbindelse tilslut = DriverManager.getConnection (url, brugernavn, adgangskode); 

Dernæst skal vi oprette en forekomst af DSLContext. Dette objekt vil være vores indgangssted for jOOQ-grænseflader:

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

I vores tilfælde passerer vi POSTGRES dialekt, men der er få andre tilgængelige som H2, MySQL, SQLite og mere.

5. Kodegenerering

For at generere Java-klasser til vores databasetabeller har vi brug for følgende jooq-config.xml fil:

   org.postgresql.Driver jdbc: postgresql: // db_url: 5432 / baeldung_database brugernavn adgangskode org.jooq.codegen.JavaGenerator org.jooq.meta.postgres.PostgresDatabase public. * com.baeldung.jooq.model C: / projects / baeldung / tutorials / jooq-eksempler / src / main / java 

Den brugerdefinerede konfiguration kræver ændringer i sektion, hvor vi placerer databasens legitimationsoplysninger og i sektion, hvor vi konfigurerer pakkens navn og placeringsmappe til klasser, som vi genererer.

For at udføre jOOQ-kodegenereringsværktøjet skal vi køre følgende kode:

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

Når generationen er afsluttet, får vi de to følgende klasser, der hver svarer til databasetabellen:

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

6. CRUD Operationer

Lad os nu se på et par grundlæggende CRUD-operationer, som vi kan udføre med jOOQ-biblioteket.

6.1. Opretter

Lad os først oprette en ny Artikel optage. For at gøre det skal vi påberåbe os newRecord metode med en korrekt tabelhenvisning som parameter:

ArticleRecord-artikel = context.newRecord (Article.ARTICLE);

Det Artikel. ARTIKEL variabel er en referenceinstans til ARTIKEL databasetabel. Det blev automatisk oprettet af jOOQ under kodegenerering.

Dernæst kan vi indstille værdier for alle nødvendige egenskaber:

article.setId (2); article.setTitle ("jOOQ eksempler"); article.setDescription ("Et par eksempler på jOOQ CRUD-operationer"); article.setAuthorId (1);

Endelig er vi nødt til at påberåbe sig butik metode på posten for at gemme den i databasen:

article.store ();

6.2. Læsning

Lad os nu se, hvordan vi kan læse værdier fra databasen. Lad os som et eksempel vælge alle forfatterne:

Resultatforfattere = context.select () .from (Author.AUTHOR) .fetch ();

Her bruger vi Vælg metode kombineret med fra klausul for at angive fra hvilken tabel vi vil læse. Påberåbe sig hente metode udfører SQL-forespørgslen og returnerer det genererede resultat.

Det Resultat objekt implementerer Iterabel interface, så det er let at gentage over hvert element. Og mens vi har adgang til en enkelt post, kan vi få dens parametre ved hjælp af getValue metode med en korrekt feltreference:

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); Heltal alder = forfatter.getValue (Forfatter.AUTHOR.AGE); System.out.printf ("Forfatter% s% s har id:% d og alder:% d% n", fornavn, efternavn, id, alder);} );

Vi kan begrænse den valgte forespørgsel til et sæt specifikke felter. Lad os kun hente artikel-id'er og titler:

Resultat artikler = context.select (Article.ARTICLE.ID, Article.ARTICLE.TITLE) .fra (Author.AUTHOR) .fetch ();

Vi kan også vælge et enkelt objekt med hent en metode. Parametrene for denne er tabelhenvisningen og en betingelse for at matche den korrekte post.

I vores tilfælde skal vi bare vælge en Forfatter med et id lig med 1:

AuthorRecord author = context.fetchOne (Author.AUTHOR, Author.AUTHOR.ID.eq (1))

Hvis ingen poster matcher betingelsen, vises hent en metoden vender tilbage nul.

6.3. Opdaterer

For at opdatere en given post kan vi bruge opdatering metode fra DSLContext objekt kombineret med en sæt metodeopkald til hvert felt, vi har brug for at ændre. Disse udsagn skal følges af a hvor klausul med en korrekt matchtilstand:

context.update (Author.AUTHOR) .set (Author.AUTHOR.FIRST_NAME, "David") .set (Author.AUTHOR.LAST_NAME, "Brown"). hvor (Author.AUTHOR.ID.eq (1)). udføre ();

Opdateringsforespørgslen kører først, når vi kalder udføre metode. Som en returværdi får vi et heltal svarende til antallet af poster, der blev opdateret.

Det er også muligt at opdatere en allerede hentet post ved at udføre dens butik metode:

ArticleRecord-artikel = context.fetchOne (Article.ARTICLE, Article.ARTICLE.ID.eq (1)); article.setTitle ("En ny artikeltitel"); article.store ();

Det butik metoden vender tilbage 1 hvis operationen var vellykket eller 0 hvis opdateringen ikke var nødvendig. F.eks. Blev intet matchet af betingelsen.

6.4. Slet

For at slette en given post kan vi bruge slet metode fra DSLContext objekt. Sletningsbetingelsen skal overføres som en parameter i det følgende hvor klausul:

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

Slet forespørgslen kører kun, når vi kalder udføre metode. Som en returværdi får vi et heltal svarende til antallet af slettede poster.

Det er også muligt at slette en allerede hentet post ved at udføre dens slet metode:

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

Det slet metoden vender tilbage 1 hvis operationen var vellykket eller 0 hvis sletning ikke var nødvendig. For eksempel når intet blev matchet af betingelsen.

7. Konklusion

I denne artikel har vi lært, hvordan man konfigurerer og opretter en simpel CRUD-applikation ved hjælp af jOOQ-rammen. Som normalt er al kildekode tilgængelig på GitHub.