JOOQ
jOOQ, acronyme pour java Object Oriented Querying en français : « programmation java orientĂ©e requĂȘte », est une bibliothĂšque logicielle lĂ©gĂšre de mapping de base de donnĂ©es en Java qui implĂ©mente le patron de conception active record. Son objectif est d'ĂȘtre Ă la fois relationnel et orientĂ© objet en fournissant un langage spĂ©cifique au domaine pour construire des requĂȘtes Ă partir de classes gĂ©nĂ©rĂ©es Ă partir d'un schĂ©ma de base de donnĂ©es.
Développé par | Data Geekery GmbH |
---|---|
DerniĂšre version | 3.14.3 () |
Ătat du projet | Actif |
Ăcrit en | Java |
Supporte les langages | Java, Kotlin, Scala |
SystĂšme d'exploitation | Multiplateforme |
Environnement | Logiciel multiplateforme |
Type | Mapping objet-relationnel |
Licence | Licence variable selon la licence du SGBD piloté par jOOQ |
Site web | http://www.jooq.org |
Chronologie des versions
Paradigme
jOOQ prĂ©tend que le SQL devrait ĂȘtre prioritaire lors de l'intĂ©gration d'une base de donnĂ©es dans un logiciel. Ainsi, il n'introduit pas de nouveau langage de requĂȘte textuelle, mais permet plutĂŽt de construire du SQL brut Ă partir d'objets jOOQ et de code gĂ©nĂ©rĂ© Ă partir du schĂ©ma de la base de donnĂ©es. jOOQ utilise JDBC pour appeler les requĂȘtes SQL sous-jacentes.
Il s'inscrit dans la logique de la programmation fonctionnelle en cherchant à masquer les détails d'implémentation des accÚs BDD pour ne garder que le métier attendu.
Bien qu'il fournisse une abstraction au-dessus du JDBC, jOOQ propose moins de fonctionnalités et de complexité que les ORM standards tels que EclipseLink ou Hibernate[1].
La proximitĂ© de jOOQ avec SQL prĂ©sente des avantages par rapport aux ORM. SQL a de nombreuses fonctionnalitĂ©s qui ne peuvent pas ĂȘtre utilisĂ©es dans un paradigme de programmation orientĂ© objet ; cet ensemble de diffĂ©rences est appelĂ© : object-relational impedance mismatch (Ă©cart paradigmatique objet-relationnel).
En Ă©tant proche de SQL, jOOQ permet d'Ă©viter les erreurs de syntaxe et les problĂšmes de mapping de type dĂ» Ă l'abondance de dĂ©claration au format String qui ne permet pas de validation Ă la compilation. En gĂ©nĂ©rant le code Ă partir de la base de donnĂ©es, les classes gĂ©nĂ©rĂ©es permettent de s'assurer dĂšs la compilation que les requĂȘtes sont valides vis-Ă -vis de l'Ă©tat de la base de donnĂ©es.
En outre, le remplissage de variables est pris en charge, permettant la construction de procédures stockées dans le code.
Il est Ă©galement possible dans jOOQ de crĂ©er des requĂȘtes trĂšs complexes, qui impliquent des alias, des unions, des sĂ©lections imbriquĂ©es et des jointures.
jOOQ prend également en charge des fonctionnalités spécifiques aux bases de données, telles que les UDT, les types enumérés, les procédures stockées et les fonctions natives[1].
Exemple
Une requĂȘte imbriquĂ©e sĂ©lectionnant dans une table aliasĂ©e :
-- SĂ©lectionne les auteurs avec des ayant un livre 'sold out'
SELECT * FROM AUTHOR a
WHERE EXISTS (SELECT 1
FROM BOOK
WHERE BOOK.STATUS = 'SOLD OUT'
AND BOOK.AUTHOR_ID = a.ID);
Et son équivalent dans le langage dédié jOOQ :
// Utilise une table aliasée dans le select
create.selectFrom(table("AUTHOR").as("a"))
.where(exists(selectOne()
.from(table("BOOK"))
.where(field("BOOK.STATUS").equal(field("BOOK_STATUS.SOLD_OUT")))
.and(field("BOOK.AUTHOR_ID").equal(field("a.ID")))));
Ou, plus simplement, en utilisant la génération de code à partir des métadonnées de la base de données :
// Utilise une table aliasée dans le select
final Author a = AUTHOR.as("a");
create.selectFrom(a)
.where(exists(selectOne()
.from(BOOK)
.where(BOOK.STATUS.equal(BOOK_STATUS.SOLD_OUT))
.and(BOOK.AUTHOR_ID.equal(a.ID))));
Notes et références
- (en) Lukas Eder, « A simple and intuitive approach to interface your database with Java », sur dzone.com, (consulté le )