jOOQ Logo

Mode troll

NoSQL? No, SQL!

History of NoSQL by Mark Madsen. Picture published by Edd Dumbill


www.nosql-vs-sql.com

No Hibernate!

Gaving King on jOOQ

www.no-more-hibernate.com
www.hibernate-alternative.com
ORMs: The Vietnam Of Computer Science

Les principes

SQL au premier plan

  • Database first: Schema base → Code Java
  • Monde relationnel au naturel:
    • SQL au premier plan
    • des tuples/enregistrements (Record) plutôt que des objets

Que du SQL

  • Pas de relations 1-N ou N-N, pas d'héritage
  • Pas de requêtage sur des collections (QueryDSL, LinQ, Slick)
  • Pas de transactions, pas de cache
  • Pas de support JPQL, MongoDB, CQL

Tout le SQL

SQL grammar

SQL Harmonisé

  • SQLDialect, comme Hibernate
  • Exemples:
    • merge / insert ... on duplicate key update
    • limit ... offset / rownum
    • nvl / ifnull

Java: API Fluent SQL

En Java

Personne p=PERSONNE.as("p");
select(p.ID, p.NOM,p.PRENOM)
    .from(p)
    .where(p.NOM.like("Q%"));                                
                            
En SQL

select p.ID, p.NOM, p.PRENOM
    from PERSONNE as p
    where p.NOM like 'Q%'
                            

Java: Type Safe

Typesafety 1
Typesafety 2
Typesafety 3

<T1, T2> SelectSelectStep<Record2<T1, T2>> 
    select(Field<T1> field1, Field<T2> field2)
                    

Active Records

  • Pour les CRUDs, comme Rails
  • Typesafe, contrairement à Rails

PersonneRecord personne = jooq
    .selectFrom(PERSONNE)
    .where(PERSONNE.ID.eq(id)).fetchOne();
personne.setPrenom("John");
personne.store();
                            

La recette

  1. Générer du code Java: extracteur → méta-modèle → générateur
  2. Contruire une requête SQL: un StringBuilder en mieux
  3. Exécuter de requête SQL et extraction/mapping des résultats
  4. Eventuellement, modifier un UpdatableRecord

Dans le détail

Code Generator

Quoi?
  • Tables, Keys, Sequences, Routines...
  • Record
  • DAO*
  • POJO*
Réglable

Code Generator

Comment?
  • Code Java
  • Ligne de commande
  • Plugin Maven
  • Plugin Gradle

DSL

  • Points d'entrée:
    • DSL et sous classes: génération du SQL (fonctions...)
    • DSLContext: DSL + ConnectionProvider, exécution du SQL
  • Depuis/vers une String

Conversion Record

  • Records jusqu'au degré 22
  • De/vers POJO:
    • Conventions + Annotation @Column JPA
    • Implémentation RecordMapper<R extends Record, E extends Object>
  • Vers List,Map ou Tableau
  • Vers XML, JSON ou CSV

Avec Spring

  • Injecter un DSLContext dans les DAOs
  • Envelopper la DataSource dans un TransactionAwareDataSourceProxy
  • Ou bien, utiliser le générateur de SQL seul + Spring JDBC
  • Eventuellement, revoir la traduction des Exceptions

ActiveRecord++

  • Dirty checking
  • Optimistic Locking
  • Parcourt des Foreign Key ( ≠ lazy-loading)
  • Mapping depuis/vers un POJO, une Map ou un Tableau
  • DynaBean possible

Autres intégrations

  • Play 2! play-jooq
  • JPA Annotations
  • Validation Annotations
  • Scala

Bases de données

Open SourceCommerciales
Apache Derby, CUBRID, Firebird, H2, Hypersonic, MariaDB, MySQL, PostgreSQL, SQLite IBM DB2, Ingres, MS Access, MS SQL Server, Oracle, Sybase Adaptive Server, Sybase SQL Anywhere,

Annotation @Support sur le DSL

C'est l'histoire d'un mec

Lukas Eder

@lukaseder

Data Geekery GmbH

Initial commitOct. 2009
V 1.0.0Aout 2010
V 2.0.0Nov. 2011
V 3.0.0Avril 2013
V 3.2.0Oct. 2013
Licence commerciale
V 3.4.0Juin 2014

Licensing

Open SourceASLpour BDD open-source
Express100€/an/devpour BDD express (prototypage)
Pro400/an/devpour BDD commerciales, code source et support inclus
Enterprise800/an/dev

Breaking news

jOOQ 3.4.0 out!
  • Transactions
  • DDL
  • Transformation du SQL
  • Common table expression (WITH) et récursivité

Questions?

Annexes

Ma comparaison

Hibernate jOOQ MyBatis
CRUD *** *** *
Batch ** *** *
Dialectes X X
Relation *** * **
Caching X X
Communauté *** * **
Extensions Envers, Validation, Spatial Migrations

Ma comparaison

Hibernate jOOQ MyBatis
Couverture SQL * ** ***
DBA friendly * ** ***
Ingrédients 33% Java,
33% Annotation,
33% JPQL
100% Java 50% Java,
50% XML
Code Gen. Criteria Obligatoire CRUD
Plugin IDE JPQL Obligatoire
Open-source 100% 50% 100%