[JAVA] Points lors du mappage d'un objet de valeur dans MyBatis

Préface

J'étais un peu accro à la cartographie des objets de valeur dans MyBatis, alors je l'ai organisé.

Ce que vous voulez réaliser

environnement

la mise en oeuvre

Supposons que vous ayez une classe d'objet de valeur appelée ʻUserName` comme ceci:

package com.example.demo.domain.model;

public class UserName {
    private final String value;

    public UserName(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }
}

La classe ʻUser contient le ʻUserName. Il contient également les classes ʻUserName et RegisterDate`.

package com.example.demo.domain.model;

import lombok.Data;

@Data
public class User {
    private UserId userId;
    private UserName userName;
    private RegisterDate registerDate;
}

Écrivez la définition de la base de données dans schema.sql.

CREATE TABLE users (
  id int NOT NULL
  , user_name VARCHAR(50)  
  , register_date DATE
);

Data.sql pour insérer des données pour les tests.

INSERT INTO users VALUES (1, 'Nocchi', '2020-02-01');
INSERT INTO users VALUES (2, 'Kashiyuka', '2020-02-02');
INSERT INTO users VALUES (3, 'A-Chan', '2020-02-03');

Définissez une méthode findById dans ʻUserRepository pour obtenir ʻUser à partir de l'ID.

package com.example.demo.domain.repository;

import com.example.demo.domain.model.User;
import com.example.demo.domain.model.UserId;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@Mapper
@Repository
public interface UserRepository {
    User findById(@Param("userId") UserId userId);
}

Mapper a le contenu suivant.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.domain.repository.UserRepository">
  <select id="findById" resultMap="UserMap" parameterType="map">
    select id, user_name, register_date from users where id = #{userId.value}
  </select>

  <resultMap id="UserMap" type="com.example.demo.domain.model.User">
      <association property="userId" javaType="com.example.demo.domain.model.UserId">
        <constructor>
          <arg name="value" column="id"/>
        </constructor>
      </association>
      <association property="userName" javaType="com.example.demo.domain.model.UserName">
        <constructor>
          <arg name="value" column="user_name"/>
        </constructor>
      </association>
      <association property="registerDate" javaType="com.example.demo.domain.model.RegisterDate">
        <constructor>
          <arg name="value" column="register_date"/>
        </constructor>
      </association>
  </resultMap>

</mapper>

point

Sans ce qui précède, la valeur de Value Object ne pourrait pas être utilisée dans select, comme where id = # {userId.value}.

La partie suivante.

<association property="userId" javaType="com.example.demo.domain.model.UserId">
        <constructor>
          <arg name="value" column="id"/>
        </constructor>
</association>

résultat

Le résultat de l'écriture du code de test et de sa rupture est le suivant. Une instance de l'objet de valeur a également été créée et les valeurs ont été mappées.

スクリーンショット 2020-02-06 5.41.18.png

code

Publié sur GitHub.

Recommended Posts

Points lors du mappage d'un objet de valeur dans MyBatis
Mappage à une classe avec un objet de valeur dans How to My Batis
Objet de valeur en 3 minutes
Valeur initiale lorsqu'il n'y a pas de propriété de l'objet de formulaire dans la requête Spring
Points bloqués lors de l'exécution de vite + Nginx dans l'environnement Docker
Bibliothèque de mappage d'objets JAVA
Comment passer un objet à Mapper dans MyBatis sans passer par un argument
[MyBatis] Utilisez le curseur lors du mappage de grandes quantités de données