jOOQ Object Oriented Querying , communément appelé jOOQ , est une bibliothèque logicielle de mappage de bases de données légères en Java qui implémente le modèle d'enregistrement actif . 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 .
Paradigme
jOOQ affirme que SQL doit être la première étape de toute intégration de base de données. Ainsi, il n'introduit pas un nouveau langage de requête textuel , mais permet plutôt de construire du SQL simple à partir d'objets jOOQ et de code généré à partir d'un schéma de base de données. jOOQ utilise JDBC pour appeler les requêtes SQL sous-jacentes.
Bien qu'il fournisse une abstraction sur JDBC, jOOQ n'a pas autant de fonctionnalités et de complexité que les bibliothèques de mappage objet-relationnel standard telles que EclipseLink ou Hibernate .
La proximité de jOOQ avec SQL présente des avantages par rapport aux bibliothèques de mappage objet-relationnel classiques. SQL possède 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é incompatibilité d'impédance objet-relationnel . En étant proche de SQL, jOOQ permet d'éviter les erreurs de syntaxe et les problèmes de mappage de types. De plus, la liaison des variables est prise en charge. 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 complexes . jOOQ prend également en charge des fonctionnalités spécifiques aux bases de données, telles que les UDT , les types d'énumération , les procédures stockées et les fonctions natives.
Exemple
Une requête imbriquée sélectionnant à partir d'une table aliasée
-- Sélectionnez les auteurs dont les livres sont épuisés SELECT * FROM AUTHOR a WHERE EXISTS ( SELECT 1 FROM BOOK WHERE BOOK . STATUS = 'SOLD OUT' AND BOOK . AUTHOR_ID = a . ID );
Et son équivalent en jOOQ DSL :
// Utiliser la table aliasée dans l'instruction 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, utiliser la génération de code à partir des métadonnées de la base de données pour générer des constantes :
// Utiliser la table aliasée dans l'instruction select final Author a = AUTHOR . as ( "a" ); créer . selectFrom ( a ) .où ( existe ( selectOne ( ) . from ( BOOK ) .où ( BOOK.STATUS.égal ( BOOK_STATUS.SOLD_OUT ) ) .et ( BOOK.AUTHOR_ID.égal ( a.ID ) ) ) ) ;