美文网首页
MyBatis鉴别器映射

MyBatis鉴别器映射

作者: JaJa大宝剑 | 来源:发表于2018-06-19 22:54 被阅读0次

    需求:有时候一个单独的数据库查询会返回很多不同的数据类型,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();
            }
        }
    

    最后贴上运行截图:


    鉴别器映射运行示例

    最后,鉴别器是一种很少使用的方式,看到这句,心里一万句MMMMMMMMMMMMMMMMMMP。。。

    相关文章

      网友评论

          本文标题:MyBatis鉴别器映射

          本文链接:https://www.haomeiwen.com/subject/gbkzeftx.html