Überlegungen zum Java Persistence Framework 2017 (2) Doma2

Vorherigen Post

Vorwort

Da ich mit der Lückenzeit schreibe, würde ich es begrüßen, wenn Sie auf Teile mit geringer Genauigkeit hinweisen könnten. Schließen Sie zunächst diejenigen aus, die EOL sind. Wir werden kostenpflichtige Funktionen in Betracht ziehen, diese jedoch aufgrund des Taschenproblems nicht verwenden. Die verwendete Datenbank ist aus einem dummen Grund wie "Nun, vielleicht kann Postgre verwendet werden, auch wenn es nicht angegeben ist" auf Postgre festgelegt.

Umgebung

Tabellenstruktur

table_1.png

Korrespondenzbereich

ORM Transaction Data Model DSL
× ×

○: Korrespondenz ×: Nicht unterstützt

Impressionen

  1. Anmerkung ist stark
  2. Image, das viel Wissen erfordert, wenn es tief geht. Ich möchte es in einer Struktur verwenden, in der mehrere Entwickler für einen Doma2-Experten hängen
  3. Ein Stil, der vor der Ausführung alles verdirbt. Die Verarbeitung von Anmerkungen ist stark
  4. Da SQL externalisiert ist, können Ausführungspläne für einzelne SQL getestet und abgerufen werden.

Stichprobe

Einzeltabellensuche

Primärschlüsselsuche

SelectByIdTest.java


EmployeeDao dao = new EmployeeDaoImpl();
AppConfig.singleton().getTransactionManager().required(() -> {
    Employee e1 = dao.selectById(BigDecimal.ZERO);
});

Stream-Suche

SelectByFirstNameAsStreamTest.java


EmployeeDao dao = new EmployeeDaoImpl();
AppConfig.singleton().getTransactionManager().required(() -> {
    // EmployeeDao#selectByFirstNameAsStream(String)Ist eine manuell hinzugefügte Signatur
    Employee e1 = dao.selectByFirstNameAsStream("John");
});

EmployeeDao.java


//In der SQL-Datei verwendete Argumentnamen und Parameter müssen denselben Namen haben
@Select
Stream<Employee> selectByFirstNameAsStream(String first_name);

META-INF/~/EmployeeDao/selectByFirstNameAsStream.sql


select
  /*%expand*/*
from
  employee
where
  first_name = /* first_name */1

Rückrufstil

SelectByFirstNameForCountTest.java


EmployeeDao dao = new EmployeeDaoImpl();
AppConfig.singleton().getTransactionManager().required(() -> {
    System.out.println(
        // EmployeeDao#selectByFirstNameForCount(String, Function<Stream<Employee>, AtomicInteger>)Ist eine manuell hinzugefügte Signatur
        dao.selectByFirstNameForCount(
            "Taro",
            e -> new AtomicInteger((int)e.count())));
});

EmployeeDao.java


//Ich dachte nicht, dass es IntFunction nicht akzeptieren würde
@Select(strategy = SelectType.STREAM)
AtomicInteger selectByFirstNameForCount(String first_name, Function<Stream<Employee>, AtomicInteger> mapper);

META-INF/~/EmployeeDao/selectByFirstNameForCountTest.sql


select
  /*%expand*/*
from
  employee
where
  first_name = /* first_name */1

Tabellenverknüpfung

EmployeeWithPost.java


@Entity(naming = NamingType.SNAKE_LOWER_CASE)
public class EmployeeWithPost {
    /** */
    @Id
    @Column(name = "id")
    BigDecimal id;

    /** */
    @Column(name = "first_name")
    String firstName;

    /** */
    @Column(name = "middle_name")
    String middleName;

    /** */
    @Column(name = "last_name")
    String lastName;

    /** */
    @Id
    @Column(name = "post_id")
    BigDecimal postId;

    /** */
    @Column(name = "name")
    String name;

    public void setId(BigDecimal id) {
        this.id = id;
    }

    public BigDecimal getId() {
        return this.id;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }

    public String getMiddleName() {
        return this.middleName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setPostId(BigDecimal postId) {
        this.postId = postId;
    }

    public BigDecimal getPostId() {
        return this.postId;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public String toString() {
        return "EmployeeWithPost["
                + this.id
                + ":"
                + this.firstName.trim()
                + "/"
                + this.middleName.trim()
                + "/"
                + this.lastName.trim()
                + " "
                + this.postId
                + "-"
                + this.name.trim()
                + "]";
    }
}

EmployeeWithPostDao.java


@Dao(config = ORMConfig.class)
public interface EmployeeWithPostDao {
    @Select
    public List<EmployeeWithPost> selectByEmployeeId(BigDecimal employeeId);
}

META-INF/(Paketnamen)/EmployeeWithPostDao/selectByEmployeeId.sql


select
  employee.id AS id,
  employee.first_name AS first_name,
  employee.middle_name AS middle_name,
  employee.last_name AS last_name,
  post.id AS post_id,
  post.name AS name
from
  employee
  INNER JOIN
    post
  ON
    post.employee_id = employee.id
where
  employee_id = /* employeeId */1

Der Punkt

  1. Die Abdeckung erfolgt über ORM + DB-Zugriffsbibliothek + Transaktion (teilweise)
  1. Die Verarbeitung von Anmerkungen zeigt Mängel bei der SQL- und DAO-Zuordnung beim Kompilieren
  1. Mit automatischer Entitätsgenerierung
  1. Erstellen Sie beim Speichern des Tabellenverknüpfungsergebnisses Ihre eigene als benutzerdefinierte Entität
  1. Die DAO- und SQL-Zuordnung basiert auf der Namenskonvention von Methodenname → Dateiname 1: 1.
  2. Es gibt einen Cache für Suchergebnisse und die Lebensdauer ist in Transaktion
  3. Suchergebnisse können als java.util.stream.Stream zurückgegeben werden

Suchtpunkte

  1. Ignorieren Sie plötzlich die Probe und sterben Sie sicher, ohne die Klasse von der Quelle zu erhalten
  2. AppConfig (* config class) ignoriert das Beispiel ebenfalls, es wird ein Unterschied im generierten Code angezeigt und es stirbt sicher ab
  1. Wenn es "@ Singleton" gibt, verwenden Sie die von "AppConfig.singleton ()" erhaltene Instanz
  2. Wenn kein "@ Singleton" vorhanden ist, verwenden Sie die von "new AppConfig ()" erhaltene Instanz.
  1. Wenn Sie den Testcode mit @ Singleton mit dem Code ohne @ Singleton verwenden, sind DAO und AppConfig separate Transaktionen von den oben genannten Spezifikationen.
  2. Doma2 verwaltet Transaktionen innerhalb der TransactionManager-Methoden
  3. DAO- und AppConfig-Transaktionen werden ausgeführt
  4. Versuche, von DAO erstellte Transaktionen in von AppConfig erstellten Transaktionen zu bearbeiten
  5. Tod
  6. Erstellen Sie eine "META-INF / (Paketname)" - Struktur direkt unter dem Quellverzeichnis und platzieren Sie die SQL-Datei.

Nach dem Post

Referenzartikel

Recommended Posts

Überlegungen zum Java Persistence Framework 2017 (2) Doma2
Berücksichtigung des Java Persistence Framework 2017 (Zusammenfassung) -1
Überlegungen zum Java Persistence Framework 2017 (6) Ebean
Überlegungen zum Java Persistence Framework 2017 (5) Iciql
Überlegungen zum Java Persistence Framework 2017 (1)
Berücksichtigung des Java Persistence Framework 2017 (8) Hibernate5
Java-Framework
Erraten Sie das Java Persistence Framework 2017 (3) Reladomo
Java Framework Vergleich
[Java] Sammlungsframework
Spielen Sie Framework2.5 (Java) -Tipps
[Java] SpringBoot + Doma2 + H2
[Entwicklung] Java Framework Vergleich
Lernen von Java Framework # 1 (Mac-Version)
Java-Versionsverwaltung unter macOS
Installieren Sie OpenJDK7 (JAVA) unter Ubuntu 14.04
Downgrade von Java unter openSUSE Linux
Reflexion über die Manipulation von Java-Strings
Beim Übergeben von Java Gold SE 8
Oracle Java 8 unter Docker Ubuntu
Überprüfungshinweise zum Java Collections Framework
Installieren Sie Java unter WSL Ubuntu 18.04
Führen Sie das Java-Applet auf Ubuntu aus
Fügen Sie Oracle Java 8 in CircleCI 2 ein
Ändern Sie die Java-Version unter CentOS
Installieren Sie Java 1.8.0 unter Amazon Linux2