Komme i gang med jOOQ

1. Introduksjon

I denne opplæringen skal vi ta en rask omvisning i å kjøre et program med jOOQ (Java Object Orientated Query). Dette biblioteket genererer Java-klasser basert på databasetabellene og lar oss lage typesikre SQL-spørringer gjennom sitt flytende API.

Vi dekker hele oppsettet, PostgreSQL-databasetilkoblingen og noen få eksempler på CRUD-operasjoner.

2. Maven-avhengigheter

For jOOQ-biblioteket trenger vi følgende tre jOOQ-avhengigheter:

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

Vi trenger også en avhengighet for PostgreSQL-driveren:

 org.postgresql postgresql 42.2.16 

3. Databasestruktur

Før vi begynner, la oss lage et enkelt DB-skjema for eksemplene våre. Vi bruker et enkelt Forfatter og en Artikkel forhold:

opprett tabell FORfatter (ID heltall PRIMÆR NØKKEL, FIRST_NAME varchar (255), LAST_NAME varchar (255), AGE heltall); lage tabell ARTIKEL (ID heltall PRIMÆR NØKKEL, TITEL varchar (255) ikke null, BESKRIVELSE varchar (255), AUTHOR_ID heltall KONSTRAINT fk_author_id REFERANSER FORfatter)

4. Databasetilkobling

La oss nå se på hvordan vi kobler til databasen vår.

For det første må vi oppgi brukeren, passordet og en full URL til databasen. Vi bruker disse egenskapene til å lage en Forbindelse objektet ved å bruke DriverManager og dets getConnection metode:

String brukernavn = "bruker"; Strengpassord = "pass"; String url = "jdbc: postgresql: // db_host: 5432 / baeldung"; Connection conn = DriverManager.getConnection (url, brukernavn, passord); 

Deretter må vi lage en forekomst av DSLContext. Dette objektet vil være inngangspunktet for jOOQ-grensesnitt:

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

I vårt tilfelle passerer vi POSTGRES dialekt, men det er få andre tilgjengelige som H2, MySQL, SQLite og mer.

5. Kodegenerering

For å generere Java-klasser for databasetabellene, trenger vi følgende jooq-config.xml fil:

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

Den tilpassede konfigurasjonen krever endringer i delen der vi plasserer databaselegitimasjonen og i delen der vi konfigurerer pakkenavnet og plasseringskatalogen for klasser som vi genererer.

For å utføre jOOQ-kodegenereringsverktøyet, må vi kjøre følgende kode:

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

Etter at generasjonen er fullført, får vi de to følgende klassene, som hver tilsvarer databasetabellen:

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

6. CRUD Operasjoner

La oss nå se på noen grunnleggende CRUD-operasjoner som vi kan utføre med jOOQ-biblioteket.

6.1. Å skape

For det første, la oss lage en ny Artikkel ta opp. For å gjøre det, må vi påberope oss ny rekord metode med en riktig tabellreferanse som parameter:

ArticleRecord artikkel = context.newRecord (Article.ARTICLE);

De Artikkel. ARTIKEL variabel er en referanseinstans til ARTIKKEL databasetabell. Den ble automatisk opprettet av jOOQ under kodegenerering.

Deretter kan vi sette verdier for alle nødvendige egenskaper:

article.setId (2); article.setTitle ("jOOQ eksempler"); article.setDescription ("Noen få eksempler på jOOQ CRUD-operasjoner"); article.setAuthorId (1);

Til slutt må vi påberope oss butikk metode på posten for å lagre den i databasen:

article.store ();

6.2. Lesning

La oss nå se hvordan vi kan lese verdier fra databasen. Som et eksempel, la oss velge alle forfatterne:

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

Her bruker vi å velge metode kombinert med fra klausul for å indikere fra hvilken tabell vi vil lese. Påkaller hente metoden kjører SQL-spørringen og returnerer det genererte resultatet.

De Resultat gjenstand implementerer Iterabel grensesnitt, så det er enkelt å gjenta over hvert element. Og mens vi har tilgang til en enkelt post, kan vi få parametrene ved å bruke getValue metode med riktig feltreferanse:

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

Vi kan begrense utvalgsspørringen til et sett med spesifikke felt. La oss bare hente artikkel-ID-ene og titlene:

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

Vi kan også velge et enkelt objekt med fetchOne metode. Parametrene for denne er tabellreferansen og en betingelse for å matche riktig post.

I vårt tilfelle, la oss bare velge en Forfatter med en id lik 1:

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

Hvis ingen poster samsvarer med tilstanden, vil fetchOne metoden vil komme tilbake null.

6.3. Oppdaterer

For å oppdatere en gitt post, kan vi bruke Oppdater metoden fra DSLContext objekt kombinert med en sett metodeinnkallinger for hvert felt vi trenger å endre. Disse uttalelsene skal følges av a hvor klausul med riktig matchtilstand:

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

Oppdateringsspørringen kjører bare etter at vi ringer henrette metode. Som en returverdi får vi et helt tall som er lik antall poster som ble oppdatert.

Det er også mulig å oppdatere en allerede hentet plate ved å utføre den butikk metode:

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

De butikk metoden vil komme tilbake 1 hvis operasjonen var vellykket eller 0 hvis oppdateringen ikke var nødvendig. For eksempel ble ingenting matchet av tilstanden.

6.4. Sletter

For å slette en gitt post, kan vi bruke slett metoden fra DSLContext gjenstand. Slettingsbetingelsen skal sendes som en parameter i det følgende hvor klausul:

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

Slettingsforespørselen kjører bare etter at vi ringer til henrette metode. Som en returverdi får vi et helt tall som er lik antall slettede poster.

Det er også mulig å slette en allerede hentet post ved å utføre den slett metode:

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

De slett metoden vil komme tilbake 1 hvis operasjonen var vellykket eller 0 hvis sletting ikke var nødvendig. For eksempel når ingenting ble matchet av tilstanden.

7. Konklusjon

I denne artikkelen har vi lært hvordan vi konfigurerer og lager en enkel CRUD-applikasjon ved hjelp av jOOQ-rammeverket. Som vanlig er all kildekode tilgjengelig på GitHub.


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