1. 程式人生 > >MyBatis從入門到精通(十三):使用discriminator鑑別器對映

MyBatis從入門到精通(十三):使用discriminator鑑別器對映

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸!

本篇部落格主要講解鑑別器對映discriminator標籤的簡單用法。

1. 明確需求

在設計之初,sys_role表的enabled欄位有2個可選值,其中1代表啟用,0 代表禁用,當狀態啟用時就有對應的許可權資訊,當狀態禁用時就沒有對應的許可權資訊,只需查詢出角色資訊即可。

所以我們的需求為:根據使用者id查詢使用者擁有的角色列表,如果角色是啟用的,就繼續查詢出角色對應的許可權列表,如果角色是禁用的,就不需要查詢對應的許可權列表。

2. 實現方式

首先,我們需要在SysRoleMapper.xml中新建角色表的對映roleMapExtend,注意這裡我們使用的是之前新建的擴充套件類SysRoleExtend:

<resultMap id="roleMapExtend" type="com.zwwhnly.mybatisaction.model.SysRoleExtend">
    <id property="id" column="id"/>
    <result property="roleName" column="role_name"/>
    <result property="enabled" column="enabled"/>
    <result property="createBy" column="create_by"/>
    <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>

然後回顧下上篇部落格中使用到的rolePrivilegeListMapSelect對映,因為接下來會用到:

<resultMap id="rolePrivilegeListMapSelect" extends="roleMap"
           type="com.zwwhnly.mybatisaction.model.SysRoleExtend">
    <collection property="sysPrivilegeList" fetchType="lazy"
                column="{roleId=id}"
                select="com.zwwhnly.mybatisaction.mapper.SysPrivilegeMapper.selectPrivilegeByRoleId"/>
</resultMap>

接下來新建本篇部落格的主人公對映rolePrivilegeListMapChoose和對應的查詢語句:

<resultMap id="rolePrivilegeListMapChoose"
           type="com.zwwhnly.mybatisaction.model.SysRoleExtend">
    <discriminator column="enabled" javaType="int">
        <case value="1" resultMap="rolePrivilegeListMapSelect"/>
        <case value="0" resultMap="roleMapExtend"/>
    </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>

discriminator標籤常用的2個屬性講解:

  • column:設定要進行鑑別比較值的列名。
  • javaType:指定列的型別,保證使用相同的Java型別來比較值。

discriminator標籤可以有1個或多個case標籤,case標籤包含以下3個屬性:

  • value:該值為discriminator標籤column屬性用來匹配的值。
  • resultMap:當column的值和value的值匹配時,可以配置使用resultMap指定的對映,resultMap優先順序高於resultType。
  • resultType:當column的值和value的值匹配時,用於配置使用resultType指定的對映。

case標籤下面可以包含的標籤和resultMap一樣,用法也一樣。

然後在SysRoleMapper介面中新增如下方法:

/**
 * 根據使用者id獲取使用者的角色資訊
 *
 * @param userId
 * @return
 */
List<SysRoleExtend> selectRoleByUserIdChoose(Long userId);

3. 單元測試

在SysRoleMapperTest測試類中新增如下測試方法:

@Test
public void testSelectRoleByUserIdChoose() {
    SqlSession sqlSession = getSqlSession();

    try {
        SysRoleMapper sysRoleMapper = sqlSession.getMapper(SysRoleMapper.class);

        // 將id=2的角色的enabled賦值為0
        SysRole sysRole = sysRoleMapper.selectById(2L);
        sysRole.setEnabled(0);
        sysRoleMapper.updateById(sysRole);

        // 獲取使用者id為1的角色
        List<SysRoleExtend> sysRoleExtendList = sysRoleMapper.selectRoleByUserIdChoose(1L);
        for (SysRoleExtend item : sysRoleExtendList) {
            System.out.println("角色名:" + item.getRoleName());
            if (item.getId().equals(1L)) {
                // 第一個角色存在許可權資訊
                Assert.assertNotNull(item.getSysPrivilegeList());
            } else if (item.getId().equals(2L)) {
                // 第二個角色的許可權為null
                Assert.assertNull(item.getSysPrivilegeList());
                continue;
            }
            for (SysPrivilege sysPrivilege : item.getSysPrivilegeList()) {
                System.out.println("許可權名:" + sysPrivilege.getPrivilegeName());
            }
        }
    } finally {
        sqlSession.close();
    }
}

執行測試程式碼,測試通過,輸出日誌如下:

DEBUG [main] - ==> Preparing: SELECT id,role_name,enabled,create_by,create_time FROM sys_role WHERE id = ?

DEBUG [main] - ==> Parameters: 2(Long)

TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time

TRACE [main] - <== Row: 2, 普通使用者, 1, 1, 2019-06-27 18:21:12.0

DEBUG [main] - <== Total: 1

DEBUG [main] - ==> Preparing: UPDATE sys_role SET role_name = ?,enabled = ?,create_by=?, create_time=? WHERE id=?

DEBUG [main] - ==> Parameters: 普通使用者(String), 0(Integer), 1(Long), 2019-06-27 18:21:12.0(Timestamp), 2(Long)

DEBUG [main] - <== Updates: 1

DEBUG [main] - ==> Preparing: 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 = ?

DEBUG [main] - ==> Parameters: 1(Long)

TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time

TRACE [main] - <== Row: 1, 管理員, 1, 1, 2019-06-27 18:21:12.0

TRACE [main] - <== Row: 2, 普通使用者, 0, 1, 2019-06-27 18:21:12.0

DEBUG [main] - <== Total: 2

角色名:管理員

DEBUG [main] - ==> Preparing: SELECT p.* FROM sys_privilege p INNER JOIN sys_role_privilege rp ON rp.privilege_id = p.id WHERE rp.role_id = ?

DEBUG [main] - ==> Parameters: 1(Long)

TRACE [main] - <== Columns: id, privilege_name, privilege_url

TRACE [main] - <== Row: 1, 使用者管理, /users

TRACE [main] - <== Row: 2, 角色管理, /roles

TRACE [main] - <== Row: 3, 系統日誌, /logs

DEBUG [main] - <== Total: 3

許可權名:使用者管理

許可權名:角色管理

許可權名:系統日誌

角色名:普通使用者

從日誌可以看出,角色1是啟用的,所以又執行了一次查詢獲取角色的許可權列表,角色2是禁用的,所以沒有執行。

4. 原始碼及參考

原始碼地址:https://github.com/zwwhnly/mybatis-action.git,歡迎下載。

劉增輝《MyBatis從入門到精通》

5. 最後

打個小廣告,歡迎掃碼關注微信公眾號:「申城異鄉人」,不定期分享Java技術乾貨,讓我們一起進步。

相關推薦

MyBatis入門精通(十三)使用discriminator鑑別對映

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解鑑別器對映discriminator標籤的簡單用法。 1. 明確需求 在設計之初,sys_role表的enabled欄位有2個可選值,其中1

Elasticsearch入門到放棄分詞初印象

Elasticsearch 系列回來了,先給因為這個系列關注我的同學說聲抱歉,拖了這麼久才回來,這個系列雖然叫「Elasticsearch 從入門到放棄」,但只有三篇就放棄還是有點過分的,所以還是回來繼續更新。 之前我們聊過了[ Elasticsearch 的索引](https://jackeyzhe.gi

MyBatis入門精通第一章配置MyBatis

從入門到精通 sim efault 入門到 eve lse version 例如 div <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC

MyBatis入門精通第一章實體類與Mapper.xml文件

1.0 style 返回值 spa map 命名 定義 當前 入門到精通 實體類: package tk.mybatis.simple.model; public class Country { public Long getId() {

MyBatis入門精通choose的用法

sele mod 需求 優先 ati create use choose oos <!-- 4.2 choose用法 需求: 在已有的sys_user表中,除

MyBatis入門精通if的用法

pass 用戶信息 插入數據 clas 不為 ike 需要 where條件 cti <!-- 4.1.1 在WHERE條件中使用if 需求: 實現一個用戶管理高級查詢功能,根

MyBatis入門精通(一)MyBatis入門

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. MyBatis簡介 ​ 2001年,Clinton Begin發起了一個名為iBATIS的開源專案,最初側重於密碼軟體的研發,後來發展成為一款基於Jav

MyBatis入門精通(二)MyBatis XML方式的基本用法之Select

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. 明確需求 書中提到的需求是一個基於角色的許可權控制需求(RBAC,即Role-Based Access Control),提到許可權管理,相信大家都不陌

MyBatis入門精通(三)MyBatis XML方式的基本用法之多表查詢

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. 多表查詢 上篇部落格中,我們示例的2個查詢都是單表查詢,但實際的業務場景肯定是需要多表查詢的,比如現在有個需求: 查詢某個使用者擁有的所有角色。這個需求

MyBatis入門精通(四)MyBatis XML方式的基本用法之增刪改

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. insert用法 1.1 簡單的insert方法 假如現在我們想新增一個使用者,該如何操作呢? 首先,在介面SysUserMapper中新增如下方法。

MyBatis入門精通(五)MyBatis 註解方式的基本用法

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 1. @Select 註解 1.1 使用Sql語句設定別名方式 假設現在有個需求:根據id查詢角色資訊。使用註解方式該如何實現呢? 首先,在介面SysRole

MyBatis入門精通(六)MyBatis動態Sql之if標籤的用法

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解如何使用if標籤生成動態的Sql,主要包含以下3個場景: 根據查詢條件實現動態查詢 根據引數值實現動態更新某些列 根據引數值實現動態插入某

MyBatis入門精通(七)MyBatis動態Sql之choose,where,set標籤的用法

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解如何使用choose,where,set標籤生成動態的Sql。 1. choose 用法 假設有這樣1個需求:當引數id有值時優先使用id查

MyBatis入門精通(八)MyBatis動態Sql之foreach標籤的用法

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解如何使用foreach標籤生成動態的Sql,主要包含以下3個場景: foreach 實現in集合 foreach 實現批量插入 forea

MyBatis入門精通(九)MyBatis高階結果對映之一對一對映

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解MyBatis中實現查詢結果一對一對映的3種方式: 使用別名實現自動對映 使用resultMap配置 使用resultMap的associ

MyBatis入門精通(十)使用association標籤實現巢狀查詢

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解使用association標籤實現巢狀查詢的方法。 1. 明確需求 仍然延用上篇部落格中的需求:根據使用者id查詢使用者資訊的同時獲取該使用

MyBatis入門精通(十一)MyBatis高階結果對映之一對多對映

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解MyBatis中如何使用collection標籤實現查詢結果一對多對映。 1. 使用collection標籤 需求:根據使用者id查詢使用者

MyBatis入門精通(十二)使用collection標籤實現巢狀查詢

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解使用collection標籤實現巢狀查詢的方法。 1. 需求升級 在上篇部落格中,我們實現了需求:根據使用者id查詢使用者資訊的同時獲取使用

MyBatis入門精通(十四)MyBatis中使用型別處理器

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解在MyBatis中如何使用型別處理器。 1. 明確需求 在設計之初,sys_role表的enabled欄位有2個可選值,其中0 代表禁用,1

Mybatis入門精通》讀書筆記(二)

第三章. Mybatis 註解方式的基本用法 表字段和Java屬性欄位對映的方式: 1. SQL語句中列取別名 2. 設定mapUnderscoreToCamelCase = true(下劃線轉駝峰) 3. resultMap對映 註解方式應用場景不多,不做過多