在MyBatis的XxxMapper.xml文件中,resultMap可以指定对象的属性是如何装配的,类似于Spring中的IoC。其中比较关键的是association和collection两个元素:
association – 复杂类型联合;许多查询结果合成这个类型。
嵌套结果映射 – associations能引用自身,或者从其它地方引用。
collection – 复杂类型集合,如ArrayList等。
嵌套结果映射 – collections能引用自身,或者从其它地方引用。
以地区为例:
<resultMap type="Area" id="areaMap">
<id column="area_id" property="area_id" />
<result column="name" property="name" />
<association property="parent" column="parent_id" select="selectParent">
</association>
<collection property="children" column="area_id" ofType="Area"
javaType="java.util.ArrayList" select="selectChildren"></collection>
</resultMap>
如何获取地区的父级地区:
<select id="selectParent" resultMap="areaMap" parameterType="int">
select * from area where area_id=#{parent_id}
</select>
如何获取地区的子级地区:
<select id="selectChildren" resultMap="areaMap" parameterType="int">
select * from area where parent_id=#{area_id}
</select>
查询一个地区,可包含该地区的父级、子级信息:
<select id="selectArea" parameterType="int" resultMap="areaMap">
select * from area where area_id=#{id}
</select>
需要注意的是:
在分级结构中,如果对象包含父节点,同时包含子节点,则会出现相互引用或包含的情况,这种情况本身没什么问题的只是在生成JSON数据时,可能会(让人)有些凌乱。