広告 Java

【MyBatis】resultMapで自動的にマッピング(autoMapping)する方法

階層構造でautoMappingを利用する方法

MyBatisでは、次のように<resultMap>を利用することで、ネストしたリスト(階層構造)を手動でマッピングできます。

<?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.dao.SampleMapper2">

    <resultMap id="companyMap" type="com.example.demo.dto.CompanyInfo">
        <id property="companyId" column="companyId"/>
        <result property="companyName" column="companyName" />
        <collection property="employeeList" ofType="com.example.demo.dto.EmployeeInfo">
            <id property="id" column="id" />
            <result property="name" column="name" />
            <result property="address" column="address" />
            <result property="phone" column="phone" />
        </collection>
    </resultMap>

    <select id="search" resultMap="companyMap">
        SELECT
            c.id AS companyId
            ,c.name AS companyName
            ,e.id
            ,e.name
            ,e.address
            ,e.phone
        FROM
            company c INNER JOIN employee e ON c.id = e.company_id
    </select>

</mapper>

<resultMap>を利用して手動でマッピングする際、マッピングする項目の数が少なければよいですが、マッピングする項目が多いと実装するのが大変です。また設定ミスをする可能性もあります。

MyBatisには、autoMappingという属性が用意されており、autoMappingをtrueにすることで自動的にマッピングしてくれます

スポンサーリンク

autoMappingの実装例

今回の例では、下記のように親子関係(会社テーブルと社員テーブルの関係性は1:n)になっているテーブルを使用しています。

会社テーブルと社員テーブルのER図

SQL文(XMLファイル)

MyBatisのSQL文(XMLファイル)は次のとおり。

[XMLファイル]

<?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.dao.SampleMapper">

    <resultMap id="companyMap" type="com.example.demo.dto.CompanyInfo" autoMapping="true">
        <id property="companyId" column="companyId"/>
        <collection property="employeeList" resultMap="employeeMap" />
    </resultMap>

    <resultMap id="employeeMap" type="com.example.demo.dto.EmployeeInfo" autoMapping="true">
        <id property="id" column="id"/>
    </resultMap>

    <select id="search" resultMap="companyMap">
        SELECT
            c.id AS companyId
            ,c.name AS companyName
            ,e.id
            ,e.name
            ,e.address
            ,e.phone
        FROM
            company c INNER JOIN employee e ON c.id = e.company_id
    </select>

</mapper>

autoMappingをtrueに設定しているため、項目のマッピングはMyBatisが自動で行ってくれます。

Mapperクラス

MyBatisのMapperクラスは次のとおり。

[Mapperクラス]

package com.example.demo.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.example.demo.dto.CompanyInfo;

@Mapper
public interface SampleMapper {

    List<CompanyInfo> search();
}

結果を格納するクラス

[com.example.demo.dto.CompanyInfo]

package com.example.demo.dto;

import java.io.Serializable;
import java.util.List;

import lombok.Data;

/**
 * 会社情報
 */
@Data
public class CompanyInfo implements Serializable {

    /**
     * 会社ID
     */
    private Long companyId;

    /**
     * 会社名
     */
    private String companyName;

    /**
     * ユーザ情報リスト
     */
    List<EmployeeInfo> employeeList;
}

[com.example.demo.dto.EmployeeInfo]

package com.example.demo.dto;

import lombok.Data;

/**
 * 社員情報
 */
@Data
public class EmployeeInfo {

    /**
     * 社員ID
     */
    private Long id;

    /**
     * 社員名
     */
    private String name;

    /**
     * 社員の住所
     */
    private String address;

    /**
     * 社員の電話番号
     */
    private String phone;
}

helpful