- <discriminator> 用于根据查询结果的某个字段值,决定使用哪个 SQL 映射配置
- 有时候,一个数据库查询可能会返回多个不同的结果集(但总体上还是有一定的联系的), 鉴别器<discriminator> 就是被设计来应对这种情况的,比如一般班级中的学生有男女
- <discriminator> 常用的两个属性如下:
属性 |
说明 |
column |
该属性用于设置要进行鉴别比较值的列。 |
javaType |
该属性用于指定列的类型,保证使用相同的java类型来比较值。 |
typeHandler |
使用这个属性,你可以覆盖默认的 typeHandler 类型处理器。 这个属性值是类的完全限定名或者是一个类型处理器的实现, 或者是类型别名。 |
jdbcType |
在这个表格之前的所支持的 JDBC 类型列表中的类型。JDBC 类型是仅仅 需要对插入, 更新和删除操作可能为空的列进行处理。 这是 JDBC 的需要, jdbcType 而不是 MyBatis 的。如果你直接使用 JDBC 编程,你需要指定这个类型-但 仅仅对可能为空的值。 |
- <discriminator> 可以有1个或多个 <case> 标签,<case> 有一个比较重要的属性
属性 |
说明 |
value |
该值为discriminator指定column用来匹配的值,当匹配的时候,结果会走这个case关联的映射 |
resultMap |
用于嵌套外部resultMap结果集 |
resultSet |
指定用于加载复杂类型的结果集名字。 |
示例
<resultMap id="userMap" type="Users">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="role" property="role"/>
<!-- 鉴别器 -->
<discriminator javaType="int" column="role">
<!--通过role查询用户信息-->
<case value="0"> //教师
<association property="UserDeatil" select="getTeacherByRole" column="role"/>
</case>
<case value="1"> //学生
<association property="UserDetail" select="getStudenetByRole" column="role"/>
</case>
</discriminator>
</resultMap>
<select id="getUserByName" resultMap="userMap">
<![CDATA[
SELECT id, name, role
FROM class c
WHERE c.id = #{id}
]]>
</select>
discriminator内部的case会和每行查询结果中的sex字段进行匹配,匹配成功了case内部的关联查询会被执行,未匹配上的,只会走discriminator外部默认配置的映射映射规则。
<!-- 通过用户sex查询用户信息 -->
<select id="getTeacher" resultType="UserDetail">
SELECT * FROM tacher
</select>
<select id="getStudent" resultType="UserDetail">
SELECT * FROM user
</select>