Doma est un framework d'accès à la base de données qui s'exécute sur Java 8 et supérieur. Vous pouvez accéder aux bases de données pour lesquelles des pilotes JDBC sont fournis, telles que MySQL, PosgreSQL, Microsoft SQL Server et H2 Database.
Les versions récentes de Doma ont ajouté une nouvelle API pour la construction SQL de type sécurisé, l'API Criteira (https://doma.readthedocs.io/en/2.43.0/criteria-api/). Cet article présente l'API Criteria basée sur la dernière version 2.43.0 au moment de la rédaction.
Supposons que vous ayez un schéma de base de données qui ressemble à ceci:
create table employee (
id integer not null primary key,
name varchar(255) not null,
age integer not null,
version integer not null);
La classe d'entité correspondant au tableau ci-dessus peut être définie comme suit:
@Entity(metamodel = @Metamodel)
public class Employee {
@Id
public Integer id;
public String name;
public Integer age;
@Version public Integer version;
}
À première vue, c'est une définition de classe d'entité normale, mais notez que la déclaration @ Entity
dit metamodel = @ Metamodel
. Cette description est très importante, et en compilant avec les paramètres appropriés, une classe de métamodèle appelée `ʻEmployee_`` sera générée dans le même package que la classe Employee.
Par souci de clarté, je vais l'omettre un peu, mais la classe de métamodèle ʻEmployee_` ressemble à ceci:
public final class Employee_ implements EntityMetamodel<Employee> {
public final PropertyMetamodel<java.lang.Integer> id = ...;
public final PropertyMetamodel<java.lang.String> name = ...;
public final PropertyMetamodel<java.lang.Integer> age = ...;
public final PropertyMetamodel<java.lang.Integer> version = ...;
}
L'intérêt de cette classe de métamodèle est qu'elle a des propriétés avec les mêmes noms que les propriétés de la classe d'entité, telles que ʻid,
name, ʻage
, version
. Il contient également des informations sur le type de propriété dans la classe d'entité.
Voici un exemple de construction de SQL à l'aide de cette classe de métamodèle et de l'API Criteria.
L'API Criteria peut être utilisée n'importe où, mais elle sera plus facile à comprendre si vous créez une classe nommée xxxRepository et que vous l'utilisez dedans, par exemple.
public class EmployeeRepository {
private final Entityql entityql;
public EmployeeRepository(Config config) {
this.entityql = new Entityql(config);
}
public Employee selectById(Integer id) {
//Génération de métamodèles
Employee_ e = new Employee_();
//Assemblez SQL en utilisant un métamodèle et obtenez le résultat
return entityql.from(e).where(c -> c.eq(e.id, id)).fetchOne();
}
}
Le contenu de la méthode selectById
de la classe ci-dessus est un exemple d'utilisation de l'API Criteria. Cette méthode utilise la classe métamodèle et la classe ʻEntityql`, qui est le point d'entrée de l'API Criteria, pour assembler SQL et obtenir le résultat de l'exécution en une seule entité.
Le SQL qui peut être assemblé ressemble à ceci:
select t0_.id, t0_.name, t0_.age, t0_.version from Employee t0_ where t0_.id = ?
Du point de vue de la sécurité des types, le point est la méthode ʻeqdans le
where (c-> c.eq (e.id, id))` qui construit la clause WHERE. Cette méthode utilise des génériques pour déterminer le type du premier argument au type du deuxième argument au moment de la compilation.
En d'autres termes, dans cet exemple, le type du deuxième argument est déterminé comme étant le type ʻInteger en passant la propriété représentant le type ʻInteger
de la classe de métamodèle au premier argument de la méthode ʻeq. Par conséquent, cela empêche de passer un type incorrect au deuxième argument (ce qui entraîne une erreur à l'exécution), par exemple
c.eq (e.id," String value ")`. ..
En utilisant l'exemple de récupération d'une entité, nous avons montré que l'API Criteri de Doma permet la construction de type sécurisé de SQL.
L'équivalent du code présenté ici est disponible dans le projet ci-dessous.
Recommended Posts