mybatis-鉴别器的使用
使用场景:当映射结果中的一个对象属性使用Object类型接收不同的对象时,可以使用鉴别器
- 实体类
public class TemplateBaseVo {
private Integer id;
private String name;
private Object content; //接收不同的映射对象
}
- 鉴别器的使用
<mapper namespace="com.xxx.shopadmin.dao.TemplateDataMapper">
<resultMap id="baseMap" type="com.xxx.shopadmin.vo.TemplateBaseVo">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 鉴别器 -->
<!-- discriminator标签属性:
* javaType:指定列的类型,保证使用相同的Java类型来比较值。
* column:要鉴别的字段名。
-->
<discriminator javaType="java.lang.Integer" column="type_id">
<!-- case标签属性:
* value:该值为discriminator标签column属性用来匹配的值。
* resultMap:当column的值和value的值匹配时,可以配置使用resultMap指定的映射,resultMap优先级高于resultType。
* resultType:当column的值和value的值匹配时,用于配置使用resultType指定的映射。
-->
<case value="1" resultMap="bannerMap"/>
<case value="2" resultMap="menuMap"/>
</discriminator>
</resultMap>
<!-- bannerMap -->
<resultMap extends="baseMap" id="bannerMap" type="com.xxx.shopadmin.vo.TemplateBaseVo">
<association property="content" column="type_id" select="getBannerVo"/>
</resultMap>
<resultMap id="templateBannerVoMap" type="com.xxx.shopadmin.vo.TemplateBannerVo">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="style" column="style"/>
<result property="height" column="height"/>
<result property="radius" column="radius"/>
<result property="x" column="x"/>
<result property="y" column="y"/>
<result property="templateViewId" column="template_view_id"/>
</resultMap>
<select id="getBannerVo" resultMap="templateBannerVoMap">
SELECT tb.* FROM template_banner tb, template_view tv
WHERE tb.template_view_id = tv.id
AND tv.type_id = #{type_id}
</select>
<!-- menuMap -->
<resultMap extends="baseMap" id="menuMap" type="com.xxx.shopadmin.vo.TemplateBaseVo">
<association property="content" column="type_id" select="getMenuVo"/>
</resultMap>
......
</mapper>