Aan de slag met jOOQ

1. Inleiding

In deze tutorial gaan we een korte rondleiding geven door het uitvoeren van een applicatie met jOOQ (Java Object Orientated Query). Deze bibliotheek genereert Java-klassen op basis van de databasetabellen en stelt ons in staat om typeveilige SQL-query's te maken via de vloeiende API.

We behandelen de hele installatie, de PostgreSQL-databaseverbinding en een paar voorbeelden van CRUD-bewerkingen.

2. Maven afhankelijkheden

Voor de jOOQ-bibliotheek hebben we de volgende drie jOOQ-afhankelijkheden nodig:

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

We hebben ook één afhankelijkheid nodig voor de PostgreSQL-driver:

 org.postgresql postgresql 42.2.16 

3. Databasestructuur

Laten we, voordat we beginnen, een eenvoudig DB-schema maken voor onze voorbeelden. We gebruiken een simpele Schrijver en een Artikel relatie:

maak tabel AUTHOR (ID geheel getal PRIMAIRE SLEUTEL, FIRST_NAME varchar (255), LAST_NAME varchar (255), AGE geheel getal); maak tabel ARTIKEL (ID geheel getal PRIMAIRE SLEUTEL, TITEL varchar (255) niet nul, BESCHRIJVING varchar (255), AUTHOR_ID geheel getal BEPERKING fk_author_id REFERENTIES AUTEUR);

4. Databaseverbinding

Laten we nu eens kijken hoe we verbinding gaan maken met onze database.

Ten eerste moeten we de gebruiker, het wachtwoord en een volledige URL naar de database opgeven. We gebruiken deze eigenschappen om een Verbinding object met behulp van de DriverManager en zijn getConnection methode:

String userName = "gebruiker"; String wachtwoord = "pass"; String url = "jdbc: postgresql: // db_host: 5432 / baeldung"; Connection conn = DriverManager.getConnection (url, gebruikersnaam, wachtwoord); 

Vervolgens moeten we een instantie van DSLContext. Dit object wordt ons toegangspunt voor jOOQ-interfaces:

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

In ons geval passeren we de POSTGRES dialect, maar er zijn enkele andere beschikbaar zoals H2, MySQL, SQLite en meer.

5. Code genereren

Om Java-klassen voor onze databasetabellen te genereren, hebben we het volgende nodig jooq-config.xml het dossier:

   org.postgresql.Driver jdbc: postgresql: // db_url: 5432 / baeldung_database gebruikersnaam wachtwoord org.jooq.codegen.JavaGenerator org.jooq.meta.postgres.PostgresDatabase publiek. * com.baeldung.jooq.model C: / projects / baeldung / tutorials / jooq-voorbeelden / src / main / java 

De aangepaste configuratie vereist wijzigingen in het sectie waar we de databasereferenties plaatsen en in het sectie waarin we de pakketnaam en locatiemap configureren voor klassen die we zullen genereren.

Om het hulpprogramma voor het genereren van jOOQ-codes uit te voeren, moeten we de volgende code uitvoeren:

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

Nadat het genereren is voltooid, krijgen we de twee volgende klassen, elk corresponderend met de bijbehorende databasetabel:

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

6. CRUD Operaties

Laten we nu eens kijken naar enkele basis CRUD-bewerkingen die we kunnen uitvoeren met de jOOQ-bibliotheek.

6.1. Creëren

Laten we eerst een nieuw Artikel Vermelding. Om dit te doen, moeten we de nieuw record methode met een juiste tabelverwijzing als parameter:

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

De Artikel.ARTICLE variabele is een referentie-instantie naar de ARTIKEL databasetabel. Het werd automatisch aangemaakt door jOOQ tijdens het genereren van code.

Vervolgens kunnen we waarden instellen voor alle benodigde eigenschappen:

artikel.setId (2); article.setTitle ("jOOQ voorbeelden"); article.setDescription ("Een paar voorbeelden van jOOQ CRUD-bewerkingen"); article.setAuthorId (1);

Ten slotte moeten we de winkel methode op het record om het op te slaan in de database:

artikel.store ();

6.2. Lezing

Laten we nu eens kijken hoe we waarden uit de database kunnen lezen. Laten we als voorbeeld alle auteurs selecteren:

Resultaat auteurs = context.select () .from (Author.AUTHOR) .fetch ();

Hier gebruiken we de selecteer methode gecombineerd met van clausule om aan te geven uit welke tabel we willen lezen. Een beroep doen op het halen methode voert de SQL-query uit en retourneert het gegenereerde resultaat.

De Resultaat object implementeert het Herhaalbaar interface, dus het is gemakkelijk om elk element te herhalen. En terwijl we toegang hebben tot een enkel record, kunnen we de parameters ervan ophalen door de getValue methode met een juiste veldreferentie:

auteurs.forEach (auteur -> {Geheel getal id = author.getValue (Author.AUTHOR.ID); String firstName = author.getValue (Author.AUTHOR.FIRST_NAME); String lastName = author.getValue (Author.AUTHOR.LAST_NAME); Geheel getal age = author.getValue (Author.AUTHOR.AGE); System.out.printf ("Auteur% s% s heeft id:% d en leeftijd:% d% n", voornaam, achternaam, id, leeftijd);} );

We kunnen de selectiequery beperken tot een set specifieke velden. Laten we alleen de artikel-ID's en titels ophalen:

Resultaat artikelen = context.select (Article.ARTICLE.ID, Article.ARTICLE.TITLE) .from (Author.AUTHOR) .fetch ();

We kunnen ook een enkel object selecteren met de fetchOne methode. De parameters voor deze zijn de tabelverwijzing en een voorwaarde die overeenkomt met het juiste record.

Laten we in ons geval gewoon een Schrijver met een id gelijk aan 1:

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

Als er geen record overeenkomt met de voorwaarde, wordt het fetchOne methode zal terugkeren nul.

6.3. Updaten

Om een ​​bepaald record bij te werken, kunnen we de bijwerken methode van de DSLContext object gecombineerd met een set methode-aanroepen voor elk veld dat we moeten wijzigen. Deze verklaring moet worden gevolgd door een waar clausule met een juiste matchconditie:

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

De update-query wordt pas uitgevoerd nadat we het uitvoeren methode. Als retourwaarde krijgen we een geheel getal dat gelijk is aan het aantal records dat is bijgewerkt.

Het is ook mogelijk om een ​​reeds opgehaald record bij te werken door het winkel methode:

ArticleRecord article = context.fetchOne (Article.ARTICLE, Article.ARTICLE.ID.eq (1)); article.setTitle ("Een nieuwe artikel titel"); artikel.store ();

De winkel methode zal terugkeren 1 als de operatie is geslaagd of 0 als de update niet nodig was. Er werd bijvoorbeeld niets geëvenaard door de conditie.

6.4. Verwijderen

Om een ​​bepaald record te verwijderen, kunnen we de verwijderen methode van de DSLContext voorwerp. De verwijderingsvoorwaarde moet worden doorgegeven als een parameter in het volgende waar clausule:

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

De verwijderquery wordt pas uitgevoerd nadat we het uitvoeren methode. Als retourwaarde krijgen we een geheel getal dat gelijk is aan het aantal verwijderde records.

Het is ook mogelijk om een ​​reeds opgehaald record te verwijderen door zijn verwijderen methode:

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

De verwijderen methode zal terugkeren 1 als de operatie is geslaagd of 0 als verwijdering niet nodig was. Bijvoorbeeld als er niets werd geëvenaard door de conditie.

7. Conclusie

In dit artikel hebben we geleerd hoe we een eenvoudige CRUD-applicatie kunnen configureren en maken met behulp van het jOOQ-framework. Zoals gewoonlijk is alle broncode beschikbaar op GitHub.


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