有时一个单独的数据库查询会返回很多不同数据类型(希望有些关联)的结果集。discriminator鉴别器标签就是用来处理这种情况的。鉴别器跟Java语言中的switch语句很相似:
discriminator标签常用的两个属性如下。
column:该属性用于设置要进行鉴别比较值的列。
javaType:该属性用于指定列的类型,保证使用相同的java类型来比较值。
discriminator标签可以有1个或多个case标签,case标签包含以下三个属性。
value:该值为discriminator指定column的值匹配时,可以配置使用resultMap指定的映射,resultMap优先级高于resultType.
<resultMap id="roleMap" type="tk.mybatis.simple.model.SysRole"> <id property="id" column="id"/> <result property="roleName" column="role_name" javaType="String" /> <result property="enabled" column="enabled"/> <association property="createInfo" javaType="tk.mybatis.simple.model.CreateInfo"> <result property="createBy" column="create_by"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> </association> </resultMap>
<resultMap id="rolePrivilegeListMapSelect" extends="roleMap" type="tk.mybatis.simple.model.SysRole"> <collection property="privilegeList" fetchType="lazy" select="tk.mybatis.simple.mapper.PrivilegeMapper.selectPrivilegeByRoleId" column="{roleId=id}"/> </resultMap> <resultMap id="rolePrivilegeListMapChoose" type="tk.mybatis.simple.model.SysRole"> <discriminator column="enabled" javaType="int"> <case value="1" resultMap="rolePrivilegeListMapSelect"/> <case value="0" resultMap="roleMap"/> </discriminator> </resultMap>
<select id="selectRoleByUserIdChoose" resultMap="rolePrivilegeListMapChoose"> select r.id, r.role_name, r.enabled, r.create_by, r.create_time from sys_role r inner join sys_user_role ur on ur.role_id = r.id where ur.user_id = #{userId} </select>