Considérations sur le cadre de persistance Java 2017 (2) Doma2

Post précédent

Préface

Étant donné que j'écris en utilisant le temps d'intervalle, je vous serais reconnaissant si vous pouviez indiquer les parties avec une précision médiocre. Tout d'abord, excluez ceux qui sont EOL. Nous considérerons les fonctions payantes, mais nous ne les utiliserons pas réellement, en raison du problème des poches. La base de données utilisée est fixée à Postgre pour une raison stupide telle que "Eh bien, peut-être que Postgre peut être utilisé même s'il n'est pas spécifié."

environnement

Structure de la table

table_1.png

Gamme de correspondance

ORM Transaction Data Model DSL
× ×

○: Correspondance ×: non pris en charge

Impressions

  1. L'annotation est forte
  2. Image qui nécessite beaucoup de connaissances pour aller en profondeur, je souhaite l'utiliser dans une structure qui accroche plusieurs développeurs pour un expert Doma2
  3. Un style qui gâche tout avant l'exécution, le traitement des annotations est fort
  4. Puisque SQL est externalisé, il est possible de tester et d'acquérir des plans d'exécution pour chaque SQL.

échantillon

Recherche de table unique

Recherche de clé primaire

SelectByIdTest.java


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

Recherche de flux

SelectByFirstNameAsStreamTest.java


EmployeeDao dao = new EmployeeDaoImpl();
AppConfig.singleton().getTransactionManager().required(() -> {
    // EmployeeDao#selectByFirstNameAsStream(String)Est une signature ajoutée manuellement
    Employee e1 = dao.selectByFirstNameAsStream("John");
});

EmployeeDao.java


//Les noms d'argument et les paramètres utilisés dans le fichier SQL doivent avoir le même nom
@Select
Stream<Employee> selectByFirstNameAsStream(String first_name);

META-INF/~/EmployeeDao/selectByFirstNameAsStream.sql


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

Style de rappel

SelectByFirstNameForCountTest.java


EmployeeDao dao = new EmployeeDaoImpl();
AppConfig.singleton().getTransactionManager().required(() -> {
    System.out.println(
        // EmployeeDao#selectByFirstNameForCount(String, Function<Stream<Employee>, AtomicInteger>)Est une signature ajoutée manuellement
        dao.selectByFirstNameForCount(
            "Taro",
            e -> new AtomicInteger((int)e.count())));
});

EmployeeDao.java


//Je ne pensais pas qu'il n'accepterait pas IntFunction
@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

Jointure de table

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/(nom du paquet)/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

Le point

  1. La couverture est ORM + bibliothèque d'accès DB + transaction (partielle)
  1. Le traitement des annotations révèle des lacunes de mappage SQL et DAO au moment de la compilation --Bien que vous puissiez utiliser votre propre langage d'expression pour SQL, sa validité est également vérifiée au moment de la compilation.
  2. Avec la génération automatique de l'entité
  1. Lors du stockage du résultat de la jointure de table, créez le vôtre en tant qu'entité personnalisée
  1. Le mappage DAO et SQL est basé sur la convention de dénomination du nom de la méthode → nom du fichier 1: 1.
  2. Il y a un cache pour les résultats de la recherche et la durée de vie est en transaction
  3. Les résultats de la recherche peuvent être renvoyés sous la forme java.util.stream.Stream

Points addictifs

  1. Ignorez soudainement l'échantillon et mourez en toute sécurité sans obtenir la classe de la source
  2. AppConfig (* config class) ignore également l'exemple, une différence apparaît dans le code généré et il meurt en toute sécurité
  1. S'il y a @ Singleton, utilisez l'instance obtenue par ʻAppConfig.singleton ()`
  2. S'il n'y a pas de @ Singleton, utilisez l'instance obtenue par new AppConfig ().
  1. Si vous utilisez le code de test avec @ Singleton avec le code sans @ Singleton, DAO et AppConfig seront des transactions distinctes des spécifications ci-dessus.
  2. Doma2 gère les transactions dans les méthodes TransactionManager
  3. Les transactions DAO et AppConfig se produisent
  4. Tentatives de manipulation des transactions produites par DAO dans les transactions produites par AppConfig
  5. Décès
  6. Créez une structure "META-INF / (nom du package)" directement sous le répertoire source et placez le fichier SQL.

Après la publication

Article de référence

Recommended Posts

Considérations sur le cadre de persistance Java 2017 (2) Doma2
Considération sur le cadre de persistance Java 2017 (résumé) -1
Considération sur le cadre de persistance Java 2017 (6) Ebean
Considération sur le framework de persistance Java 2017 (5) Iciql
Considération sur le framework de persistance Java 2017 (1)
Considérations sur le cadre de persistance Java 2017 (8) Hibernate5
framework java
Devinez le cadre de persistance Java 2017 (3) Reladomo
Comparaison du framework Java
[Java] Cadre de collection
Conseils pour Play Framework2.5 (Java)
[Java] SpringBoot + Doma2 + H2
[Développement] Comparaison du framework Java
Apprentissage du framework Java # 1 (version Mac)
Gestion des versions Java sur macOS
Installez OpenJDK7 (JAVA) sur ubuntu 14.04
Rétrograder Java sur openSUSE Linux
Réflexion sur la manipulation de chaînes Java
En passant Java Gold SE 8
Oracle Java 8 sur Docker Ubuntu
Notes de révision de Java Collections Framework
Installez Java sur WSL Ubuntu 18.04
Exécutez l'applet java sur ubuntu
Mettez Oracle Java 8 dans CircleCI 2
Changer la version java sur CentOS
Installez java 1.8.0 sur Amazon linux2