階層構造で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)になっているテーブルを使用しています。
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
この記事は役に立ちましたか?