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