鉴别器 ‹discriminator›

Exisi 2021-03-27 07:31:00
Categories: Tags:
  • <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>