jOOQ este o bibliotecă Java, folosită pentru maparea bazelor de date. API-ul astfel rezultat este domain-specific (DSL), reprezentând o abstracție construită pe modelele relațional și obiect orientat (ORM) ale bazelor de date.
jOOQ nu reprezintă un nou limbaj de interogare ci un instrument de construire a clauzelor SQL din obiecte jOOQ generate din baza de date. jOOQ folosește JDBC pentru apelurile la resursa bazei de date.
Deși jOOQ nu are atâtea funcționalități precum ORM-urile (spre exemplu: managementul stărilor entităților, moștenire, interogări polimorfice, etc.), acesta permite crearea de interogări complexe ce implică reuniuni, alias-uri, select-uri imbricate sau joncțiuni complexe, adică acoperă funcționalitatea extinsă SQL.
Principalele artefacte generate ca structuri predefinite, dar care pot fi modificate și adaptate la nivel de model si accesibilitate, pentru jOOQ sunt:
Keys.java, ce conține cheile primare, străine și identitățile referențiale ca membri statici, instanța clasei org.jooq.Key;
Tables.java, ce conține toate obiectele tabel ca membri statici, instanța a clasei org.jooq.Table;
Extensie a clasei org.jooq.impl.SchemaImpl, ce conține un array cu toate tabelele bazei de date;
Extensie a clasei org.jooq.impl.TableImpl, ce definește structura unei tabele din baza de date. O astfel de extensie apare pentru fiecare tabelă din baza de date;
Vom folosi ca demo pentru acest articol generarea default, pentru o bază de date PostgreSQL. Într-un proiect Maven, pom.xml va avea următorul conținut:
<dependencies>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
<dependency>
<groupId>org.postgis</groupId>
<artifactId>postgis-jdbc</artifactId>
<version>1.3.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>3.6.1</version>
<configuration>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<!-- JDBC connection parameters -->
<jdbc>
<driver>org.postgresql.Driver</driver>
<url>dbc:postgresql://localhost:5432/mydatabase</url>
<user>username</user>
<password>password</password>
</jdbc>
<!-- Generator parameters -->
<generator>
<name>org.jooq.util.DefaultGenerator</name>
<database> <name>org.jooq.util.postgres.PostgresDatabase</name>
<includes>.*</includes>
<excludes></excludes> <inputSchema>myschema</inputSchema>
</database>
<target>
<packageName>test.generated</packageName>
<directory>src/main/java</directory>
</target>
</generator>
</configuration>
</plugin>
</plugins>
</build>
Primele două dependențe, jooq și jooq-meta, sunt folosite ca pachete de bază pentru rularea jOOQ, respectiv pentru metadatele utilizate în maparea bazei de date în clase Java.
Cea de-a treia dependență jOOQ, jooq-codegen-maven, este un utilitar pentru generarea efectivă a schemei baze de date.
Alte tag-uri importante implicate în pom sunt:
jdbc, care conține metadatele de conectare la baza de date;
generator, cu sub-tag-urile:
database, ce stabilește dialectul folosit din jooq-meta. Numele se creează după construcția implicită: org.util.[numeVendor].[NumeVendor]Database
includes, ce stabilește, sub forma unor expresii regulate Java (separatorul de expresii fiind pipe-ul), care sunt elementele ce vor fi generate din schema bazei de date;
target, cu două subelemente:
packageName, reprezintă numele pachetului în care se vor genera clasele amintite în paragrafele anterioare;
O aplicație ce interacționează cu o baza de date PostgreSQL, ce conține o tabelă, urmărește pașii:
crearea unei conexiuni, instanță a clasei Connection, din java.sql (aceasta este practic singurul element JDBC prezent în aplicație)
DSLContext create = DSL.using(conn, SQLDialect.POSTGRES_9_4);
Clasele implicate sunt: DSLContext este interfața ce conține principalele funcționalități pentru obiectul de interogare, iar DSL este un factory pentru diversele tipuri de dialecte;
crearea interogării este simplă, prin apeluri de metode din obiectul anterior creat;
Prezentăm mai jos codul integral al acestei aplicații demo:
final String userName = "postgres";
final String password = "fcdss";
final String url = "jdbc:postgresql://localhost:5432/mytests";
try (final Connection conn = DriverManager.getConnection(url, userName, password)) {
final DSLContext create = DSL.using(conn,SQLDialect.POSTGRES_9_4);
final Result result = create.select().from(Tables.AUTHOR).fetch();
for (final Record r : result) {
final Integer id = r.getValue(Tables.AUTHOR.ID);
final String firstName = r.getValue(Tables.AUTHOR.FIRST_NAME);
final String lastName = r.getValue(Tables.AUTHOR.LAST_NAME);
System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName);
}
} catch (final Exception e) {
e.printStackTrace();
}
Vom dezvolta subiectul în numerele viitoare ale revistei, cu argumente de performanță și paralelă între jOOQ și ORM-uri precum JPA.
Vă dorim lectură plăcută!