Doma ist ein Datenbankzugriffsframework, das unter Java 8 und höher ausgeführt wird. Sie können auf Datenbanken zugreifen, für die JDBC-Treiber bereitgestellt werden, z. B. MySQL, PosgreSQL, Microsoft SQL Server und H2 Database.
Neuere Versionen von Doma haben eine neue API für die typsichere SQL-Konstruktion hinzugefügt, die Criteira-API (https://doma.readthedocs.io/en/2.43.0/criteria-api/). In diesem Artikel wird die Kriterien-API vorgestellt, die auf der neuesten Version 2.43.0 zum Zeitpunkt des Schreibens basiert.
Angenommen, Sie haben ein Datenbankschema, das folgendermaßen aussieht:
create table employee (
id integer not null primary key,
name varchar(255) not null,
age integer not null,
version integer not null);
Die Entitätsklasse, die der obigen Tabelle entspricht, kann wie folgt definiert werden:
@Entity(metamodel = @Metamodel)
public class Employee {
@Id
public Integer id;
public String name;
public Integer age;
@Version public Integer version;
}
Auf den ersten Blick handelt es sich um eine normale Entitätsklassendefinition. Beachten Sie jedoch, dass in der Deklaration "@ Entity" "metamodel = @ Metamodel" steht. Diese Beschreibung ist sehr wichtig, und beim Kompilieren mit den entsprechenden Einstellungen wird eine Metamodellklasse mit dem Namen "Employee_" im selben Paket wie die Employee-Klasse generiert.
Der Klarheit halber werde ich es etwas weglassen, aber die Metamodellklasse Employee_
sieht folgendermaßen aus:
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 = ...;
}
Der Punkt dieser Metamodellklasse ist, dass sie Eigenschaften mit denselben Namen wie die Eigenschaften der Entitätsklasse hat, wie z. B. "id", "name", "age", "version". Es enthält auch Informationen zum Eigenschaftstyp in der Entitätsklasse.
Das folgende Beispiel zeigt, wie SQL mithilfe dieser Metamodellklasse und der Kriterien-API tatsächlich erstellt wird.
Die Kriterien-API kann überall verwendet werden. Es ist jedoch einfacher zu verstehen, wenn Sie eine Klasse mit dem Namen xxxRepository erstellen und darin verwenden, z. B.:
public class EmployeeRepository {
private final Entityql entityql;
public EmployeeRepository(Config config) {
this.entityql = new Entityql(config);
}
public Employee selectById(Integer id) {
//Metamodellgenerierung
Employee_ e = new Employee_();
//Stellen Sie SQL mithilfe eines Metamodells zusammen und erhalten Sie das Ergebnis
return entityql.from(e).where(c -> c.eq(e.id, id)).fetchOne();
}
}
Der Inhalt der selectById
-Methode der obigen Klasse ist ein Beispiel für die Verwendung der Kriterien-API. Diese Methode verwendet die Metamodell-Klasse und die Entityql-Klasse, die der Einstiegspunkt der Kriterien-API ist, um SQL zusammenzustellen und das Ausführungsergebnis als eine Entität abzurufen.
Das SQL, das zusammengestellt werden kann, sieht folgendermaßen aus:
select t0_.id, t0_.name, t0_.age, t0_.version from Employee t0_ where t0_.id = ?
Aus typsicherer Sicht ist der Punkt die "eq" -Methode in "where (c-> c.eq (e.id, id))", die die WHERE-Klausel erstellt. Diese Methode verwendet Generika, um den Typ des ersten Arguments zum Typ des zweiten Arguments zur Kompilierungszeit zu bestimmen.
Mit anderen Worten, in diesem Beispiel wird der Typ des zweiten Arguments als "Integer" -Typ bestimmt, indem die Eigenschaft, die den "Integer" -Typ der Metamodellklasse darstellt, an das erste Argument der "eq" -Methode übergeben wird. Daher wird verhindert, dass ein falscher Typ an das zweite Argument übergeben wird (was zur Laufzeit zu einem Fehler führt), z. B. "c.eq (e.id," String value ")". ..
Am Beispiel des Abrufs einer Entität haben wir gezeigt, dass die Criteri-API von Doma eine typsichere Erstellung von SQL ermöglicht.
Das Äquivalent des hier gezeigten Codes ist im folgenden Projekt verfügbar.