需求:有时候一个单独的数据库查询会返回很多不同的数据类型,discriminator鉴别器标签就是用来处理这种情况的。鉴别器非常容易理解,有点想java里面的switch语句。
discriminator标签常用的两个属性如下:
- column:该属性用于设置要进行鉴别比较值的列。
- javaType:该属性用于指定列的类型,保证使用相同的java类型来比较值。
discriminator标签可以有1个或多个case标签,case标签包含下面三个属性:
- value:该值为discriminator指定column用来匹配的值。
- resultMap:当column的值和value的值匹配时,可以配置resultMap和指定的映射。resultMap的优先级比resultType的优先级高。
- resultType:当column的值和value的值匹配时,可以配置resultType指定的映射。
根据之前的用户角色管理系统直接从代码开始吧:
首先在roleMap.xml中添加:
<resultMap id="roleMap" type="pers.congcong.myBatis2.pojos.SysRole">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="role_name" jdbcType="VARCHAR" property="roleName" />
<result column="enabled" jdbcType="INTEGER" property="enabled" />
<result column="create_by" jdbcType="BIGINT" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
</resultMap>
<resultMap id="rolePrivilegeListMapSelect" extends="roleMap" type="pers.congcong.myBatis2.pojos.SysRole">
<collection property="privileges" fetchType="lazy" column="{roleId=id}" select="pers.congcong.myBatis2.mappers.PrivilegeMapper.selectPrivilegeByRoleId"/>
</resultMap>
<resultMap id="rolePrivilegeListMapChoose" type="pers.congcong.myBatis2.pojos.SysRole">
<discriminator column="enabled" javaType="int">
<case value="1" resultMap="rolePrivilegeListMapSelect"></case>
<case value="0" resultMap="roleMap"></case>
<!--使用resultType可以限定字段,但是麻烦一点-->
<!--<case value="2" resultType="pers.congcong.myBatis2.pojos.SysRole">-->
<!--<id property="id" column="id"/>-->
<!--<result property="roleName" column="role_name"/>-->
<!--</case>-->
</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>
用<select>的resultMap指向id = rolePrivilegeListMapChoose的resultMap,然后这个resultMap里面有一个discriminator 标签,相当于switch,然后根据column = "enabled"的内容,返回适当的resultMap。当enabled为1时,就加载权限的信息。
然后添加接口,写测试代码:
@Test
public void testSelectRoleByUserIdChoose() {
SqlSession sqlSession = getSqlSession();
try {
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
SysRole role = roleMapper.selectById(2l);
role.setEnable(0);
roleMapper.updateById(role);
List<SysRole> sysRoles = roleMapper.selectRoleByUserIdChoose(1l);
//一个改了enabled
for (SysRole r :
sysRoles) {
if (r.getId().equals(1l))
Assert.assertNotNull(r.getPrivileges());
if (r.getId().equals(2l)) {
Assert.assertNull(r.getPrivileges());
continue;
}
for (SysPrivilege sysPrivilege : r.getPrivileges()) {
System.out.println(sysPrivilege.getPrivilegeName());
}
}
Assert.assertNotNull(sysRoles);
} finally {
sqlSession.close();
}
}
最后贴上运行截图:
鉴别器映射运行示例
网友评论