[JAVA] Punkte beim Zuordnen von Wertobjekten in MyBatis

Vorwort

Ich war ein wenig süchtig danach, Value Object in MyBatis zuzuordnen, also habe ich es organisiert.

Was Sie erreichen wollen

Umgebung

Implementierung

Angenommen, Sie haben eine Wertobjektklasse mit dem Namen "Benutzername" wie folgt:

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;
    }
}

Die User Klasse enthält den UserName. Es enthält auch die Klassen "UserName" und "RegisterDate".

package com.example.demo.domain.model;

import lombok.Data;

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

Schreiben Sie die DB-Definition in schema.sql.

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

Data.sql zum Einfügen von Daten zum Testen.

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');

Definieren Sie eine Methode "findById" in "UserRepository", um "User" aus der ID abzurufen.

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 hat den folgenden Inhalt.

<?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>

Punkt

Ohne das oben Gesagte könnte der Wert von Value Object nicht in select verwendet werden, z. B. where id = # {userId.value}.

Der folgende Teil.

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

Ergebnis

Das Ergebnis des Schreibens und Brechens des Testcodes ist wie folgt. Eine Instanz des Wertobjekts wurde ebenfalls erstellt und die Werte wurden zugeordnet.

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

Code

Veröffentlicht auf GitHub.

Recommended Posts

Punkte beim Zuordnen von Wertobjekten in MyBatis
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
Wertobjekt in 3 Minuten
Anfangswert, wenn die Spring-Anforderung keine Eigenschaft des Formularobjekts enthält
Punkte, die beim Ausführen von vite + Nginx in der Docker-Umgebung hängen bleiben
JAVA-Objektzuordnungsbibliothek
So übergeben Sie ein Objekt in MyBatis an Mapper, ohne ein Argument durchzugehen
[MyBatis] Verwenden Sie den Cursor, wenn Sie große Datenmengen zuordnen