【Spring Boot】【Mybatis】Xmlベースで単一SQLのネストによるマッピング実装

前回の続きです。
前提などは前回の記事を確認してください。

Xmlベースで単一SQLのネストによるマッピング実装

アノテーションベースのマッピング実装をXMLを使用した実装にしたらどうなるか・・・?というのが主題です。

コード

DemoMapperXmlSepalete.java

package com.example.demo.repository;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.example.demo.entity.Country;

@Mapper
public interface DemoMapperXmlSepalate {

    Country selectCountry(@Param("id")Integer id);
    
}

かなりすっきりしました。
SQLとマッピングを全てXMLにしたので当然と言えば当然。

DemoMapperXmlSepalete.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.repository.DemoMapperXmlSepalate">
    
    <resultMap id="countryMap" type="com.example.demo.entity.Country" >
    
        <result column="country" property="country" />
        <result column="last_update" property="lastUpdate" />
        <association property="id" column="country_id" select="selectCountryId" />
        <collection property="city" column="country_id" select="selectCity" />
    
    </resultMap>
    <select
        id="selectCountry"
        resultMap="countryMap">
        SELECT *
        FROM
            country
        WHERE
            country_id = #{id}
    </select>
    
    <resultMap id="countryIdMap" type="com.example.demo.entity.CountryId" >
        <result column="country_id" property="countryId" />
    </resultMap>
    <select
        id="selectCountryId"
        resultMap="countryIdMap">
        SELECT *
        FROM
            country
        WHERE
            country_id = #{id}
    </select>
    
    
    <resultMap id="cityMap" type="com.example.demo.entity.City" >
        <result column="city_id" property="cityId" />
        <result column="city" property="city" />
        <result column="last_update" property="lastUpdate" />
        <collection property="address" column="city_id" select="selectAdress" />
    </resultMap>
    <select
        id="selectCity"
        resultMap="cityMap">
        SELECT *
        FROM
            city
        WHERE
            country_id = #{id}
    </select>
    
    <resultMap id="addressMap" type="com.example.demo.entity.Address" >
    <result column="address_id" property="addressId" />
        <result column="address" property="address" />
        <result column="address2" property="address2" />
        <result column="district" property="district" />
        <result column="postal_code" property="postalCode" />
        <result column="phone" property="phone" />
        <result column="last_update" property="lastUpdate" />
    </resultMap>
    <select
        id="selectAdress"
        resultMap="addressMap">
        SELECT *
        FROM
            address
        WHERE
            city_id = #{id}
    </select>
</mapper>

説明

最初のmapper.namespace属性で、マッパーインタフェース(DemoMapperXmlSepalete.java)とマッピングしMybatisで認識できるようにしています。

内容はアノテーションベースのソースと見比べてもらえれば大体わかると思います。
@OneがXmlではassosiationタグになり、
@ManyがXmlではCollectionタグになっています。

結果

アノテーションベースと同じくネストされたオブジェクトへのマッピングが出来ています。

Xmlベースで結合SQLによるマッピング実装

長くなってしまったので続きは別記事で

mybatisカテゴリの最新記事