J'étais un peu accro à la cartographie des objets de valeur dans MyBatis, alors je l'ai organisé.
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>
select, ajoutez l'annotation @ Param@ Param, ajoutez parameterType =" map " à l'option de selectSans ce qui précède, la valeur de Value Object ne pourrait pas être utilisée dans select, comme where id = # {userId.value}.
constructor pour mapper les valeurs au constructeur d'objet de valeurname de ʻarg`La partie suivante.
<association property="userId" javaType="com.example.demo.domain.model.UserId">
        <constructor>
          <arg name="value" column="id"/>
        </constructor>
</association>
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.
Recommended Posts