前言
项目中,有一个数据按不同类型被其他对象重复持有,如何做映射封装的问题。
e.g. 有两张表
- 课程表
- 教师表
- 一个课程有两个教师,一个主教,一个辅教。
- 课程表中的课程有两个id,分别应用两个教师。
所以最终结果对象就是:
class 课程{
主教;
辅教;
}
原处理
课程表连两次教师表,然后把两次教师表返回的行数据都附带上不一样的别名(前缀)。mybatis做两次map。
简化处理
<sql id="教师Field">
${alias}.`id` AS ${alias}_id,
${alias}.`name` AS ${alias}_name,
...
</sql>
<resultMap id="教师Map" type="教师">
<id column="教师_id" property="id"/>
<result column="教师_name" property="name"/>
...
</resultMap>
<resultMap id="课程DtoMap" type="课程dto" extends="课程Map">
<association property="主教" columnPrefix="主_" resultMap="namespace...教师Map" />
<association property="辅教" columnPrefix="辅_" resultMap="namespace...教师Map" />
</resultMap>
<select id="page" resultMap="课程DtoMap">
SELECT
<include refid="namespace...教师Field">
<property name="alias" value="主_教师"/>
</include>,
<include refid="namespace...教师Field">
<property name="alias" value="辅_教师"/>
</include>
FROM
表...
</select>
更简化处理
如果需求比较简单,那就 教师Map 的映射都不用写。在association元素中,columnPrefix属性直接 主_教师_ 这样截取,然后返回javaType为教师(高版本的mybatis会自动把下划线参数转化为驼峰)。