前回の続きです。
前提などは前回の記事を確認してください。
目次
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によるマッピング実装
長くなってしまったので続きは別記事で