[JAVA] Erste Schritte mit Doma-Einführung in die Kriterien-API

Einführung

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.

Definition der Entitätsklasse

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.

Memo Inhalt der Modellklasse

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.

Verwenden der Kriterien-API

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 ")". ..

abschließend

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.

Recommended Posts

Erste Schritte mit Doma-Einführung in die Kriterien-API
Erste Schritte mit Doma-Dynamic Erstellen von WHERE-Klauseln mit der Kriterien-API
Erste Schritte mit der Doma-Projektion mit der Criteira-API
Erste Schritte mit Doma-Using Joins mit der Criteira-API
Erste Schritte mit Reactive Streams und der JDK 9 Flow API
Jetzt ist es an der Zeit, mit der Stream-API zu beginnen
Erste Schritte mit dem Doma-Criteria API Cheet Sheet
Beginnen Sie mit der Funktionsweise von JVM GC
Zurück zum Anfang, Erste Schritte mit Java ② Steueranweisungen, Schleifenanweisungen
Erste Schritte mit DBUnit
Erste Schritte mit Ruby
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
Erste Schritte mit Swift
Erste Schritte mit Doma-Transaktionen
Erste Schritte mit Doma-using Logical Operators wie AND und OR in der WHERE-Klausel der Criteria-API
Erste Schritte mit der Verarbeitung von Doma-Annotationen
Erste Schritte mit Java Collection
Erste Schritte mit JSP & Servlet
Erste Schritte mit Java Basics
Erste Schritte mit Spring Boot
Erste Schritte mit Ruby-Modulen
Zurück zum Anfang und erste Schritte mit Java ① Datentypen und Zugriffsmodifikatoren
Was ich mit der Redmine REST API süchtig gemacht habe
Wie fange ich mit schlank an?
[java8] Um die Stream-API zu verstehen
Erste Schritte mit Java_Kapitel 5_Praktische Übungen 5_4
[Google Cloud] Erste Schritte mit Docker
Erste Schritte mit Docker mit VS-Code
CompletableFuture Erste Schritte 2 (Versuchen Sie, CompletableFuture zu erstellen)
Erste Schritte mit Ruby für Java-Ingenieure
Ich habe versucht, mit Web Assembly zu beginnen
[Hinweis] Erste Schritte mit Rspec
Einführung in Java ab 0 Teil 1
So konvertieren Sie ein Array von Strings mit der Stream-API in ein Array von Objekten
Erste Schritte mit Ratpack (4) -Routing & Static Content
Ich habe versucht, die Stream-API zusammenzufassen
Erste Schritte mit Micronaut 2.x ~ Native Build und Bereitstellung für AWS Lambda ~
Erste Schritte mit dem Language Server Protocol mit LSP4J
Ich möchte ein Komitee mit Rails vorstellen, ohne zu schmutzig zu werden
Erste Schritte mit dem Erstellen von Ressourcenpaketen mit ListResoueceBundle
Teil 2 Teil II. So fahren Sie mit den ersten Schritten fort Spring Referenzhandbuch Note Hinweis ①
Drucken Sie Formulare mit Jasper Reports direkt auf dem Drucker
Links & Memos für den Einstieg in Java (für mich)
Zuordnung zu mehreren Variablen mit dem ternären Operator
Erste Schritte mit Java 1 Ähnliche Dinge zusammenstellen
Verwendung der Java-API mit Lambda-Ausdrücken
Übergeben Sie mit link_to zwei Argumente an den URI
So erstellen Sie eine API mit GraphQL und Rails
Rails-Anfänger haben versucht, mit RSpec zu beginnen
Versuchen Sie, das gemeinsame Layout mit Schienen zusammenzufassen
Ich habe versucht, mit Gradle auf Heroku zu beginnen
Ich habe versucht, den Betrieb der http-Anfrage (Put) mit dem Talented API Tester zu überprüfen
Implementieren wir eine Funktion, um die Anzahl der Zugriffe auf die API mit SpringBoot + Redis zu begrenzen
Ich möchte die API mit Rails auf mehreren lokal eingerichteten Docker-Composes treffen
[DDD] Was ist die am besten zugängliche Architektur, um mit domänengesteuertem Design zu beginnen?
So ändern Sie die Aktion mit mehreren Senden-Schaltflächen
Erste Schritte mit Java-Programmen mit Visual Studio Code
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu