TSM - jOOQ, pentru simplificarea integrării SQL-ului în Java

Silviu Dumitrescu - Line manager@Telenav


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:

  1. Extensie a clasei org.jooq.impl.SchemaImpl, ce conține un array cu toate tabelele bazei de date;

  2. 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;

  3. Extensie a clasei org.jooq.impl.UpdatableRecordImpl, ce definește operațiile de afișare si modificare ale unei înregistrări dintr-o tabelă. O astfel de extensie apare pentru fiecare tabelă din bază.

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:

target, cu două subelemente: 

  1. packageName, reprezintă numele pachetului în care se vor genera clasele  amintite în paragrafele anterioare;

  2. directory, reprezintă numele directorului în care vor fi create pachetele anterioare. 

O aplicație ce interacționează cu o baza de date PostgreSQL, ce conține o tabelă, urmărește pașii:

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;

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ă!