mybatis 同一张表的数据被映射到 一个结果对象实例 的 多个属性对象 上

1,164 阅读1分钟

前言

项目中,有一个数据按不同类型被其他对象重复持有,如何做映射封装的问题。
e.g. 有两张表

  1. 课程表
  2. 教师表
  • 一个课程有两个教师,一个主教,一个辅教。
  • 课程表中的课程有两个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会自动把下划线参数转化为驼峰)。