需求:有時(shí)候一個(gè)單獨(dú)的數(shù)據(jù)庫查詢會(huì)返回很多不同的數(shù)據(jù)類型廊敌,discriminator鑒別器標(biāo)簽就是用來處理這種情況的铜跑。鑒別器非常容易理解,有點(diǎn)想java里面的switch語句骡澈。
discriminator標(biāo)簽常用的兩個(gè)屬性如下:
- column:該屬性用于設(shè)置要進(jìn)行鑒別比較值的列锅纺。
- javaType:該屬性用于指定列的類型,保證使用相同的java類型來比較值秧廉。
discriminator標(biāo)簽可以有1個(gè)或多個(gè)case標(biāo)簽伞广,case標(biāo)簽包含下面三個(gè)屬性:
- value:該值為discriminator指定column用來匹配的值。
- resultMap:當(dāng)column的值和value的值匹配時(shí)疼电,可以配置resultMap和指定的映射嚼锄。resultMap的優(yōu)先級(jí)比resultType的優(yōu)先級(jí)高。
- resultType:當(dāng)column的值和value的值匹配時(shí)蔽豺,可以配置resultType指定的映射区丑。
根據(jù)之前的用戶角色管理系統(tǒng)直接從代碼開始吧:
首先在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可以限定字段,但是麻煩一點(diǎn)-->
<!--<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修陡,然后這個(gè)resultMap里面有一個(gè)discriminator 標(biāo)簽沧侥,相當(dāng)于switch,然后根據(jù)column = "enabled"的內(nèi)容魄鸦,返回適當(dāng)?shù)膔esultMap宴杀。當(dāng)enabled為1時(shí),就加載權(quán)限的信息拾因。
然后添加接口旺罢,寫測(cè)試代碼:
@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);
//一個(gè)改了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();
}
}
最后貼上運(yùn)行截圖: