MyBatisでネストしたリストをマッピングする方法
MyBatisで親子関係になっているネストしたリスト(階層構造)をマッピングする方法を紹介します。
例えば、次のようなテーブルがあるとします。(会社テーブルと社員テーブルの関係性は1:n)
この2つのテーブルを結合したSQL文を発行し、下記のようなオブジェクトにマッピングしたい、というケースはよくあります。
SELECT
c.id
,c.name
,e.id AS employeeId
,e.name AS employeeName
,e.address
,e.phone
FROM
company c INNER JOIN employee e ON c.id = e.company_id
/**
* 会社情報
*/
@Data
public class CompanyInfo implements Serializable {
/**
* 会社ID
*/
private Long companyId;
/**
* 会社名
*/
private String companyName;
/**
* ユーザ情報リスト
*/
List<EmployeeInfo> employeeList;
}
本記事では、MyBatisでネストしたリストをマッピングする方法を紹介します。
スポンサーリンク
SQL文(XMLファイル)
MyBatisのSQL文(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">
<id property="companyId" column="id"/>
<result property="companyName" column="name" />
<collection property="employeeList" ofType="com.example.demo.dto.EmployeeInfo">
<id property="employeeId" column="employeeId" />
<result property="employeeName" column="employeeName" />
<result property="employeeAddress" column="address" />
<result property="employeePhone" column="phone" />
</collection>
</resultMap>
<select id="search" resultMap="companyMap">
SELECT
c.id
,c.name
,e.id AS employeeId
,e.name AS employeeName
,e.address
,e.phone
FROM
company c INNER JOIN employee e ON c.id = e.company_id
</select>
</mapper>
resultMapで階層構造を作ります。このとき<id>の指定を忘れないように注意しましょう。
resultMapの定義では、columnにはSQLのカラム名、propertyにはjavaクラスのフィールド名 propertyを指定します。
Mapperクラス
MyBatisのMapperクラスは次のとおり。
@Mapper
public interface SampleMapper {
List<CompanyInfo> search();
}
結果を格納するクラス
SQL文の実行結果を格納するクラスは次のとおり。
[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 employeeId;
/**
* 社員名
*/
private String employeeName;
/**
* 社員の住所
*/
private String employeeAddress;
/**
* 社員の電話番号
*/
private String employeePhone;
}
helpful
この記事は役に立ちましたか?