階層構造で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
この記事は役に立ちましたか?