MyBatis鑒別器映射

需求:有時(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)行截圖:


鑒別器映射運(yùn)行示例

最后旷余,鑒別器是一種很少使用的方式,看到這句扁达,心里一萬句MMMMMMMMMMMMMMMMMMP正卧。。跪解。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炉旷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叉讥,更是在濱河造成了極大的恐慌窘行,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件节吮,死亡現(xiàn)場(chǎng)離奇詭異抽高,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)透绩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門翘骂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帚豪,你說我怎么就攤上這事碳竟。” “怎么了狸臣?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵莹桅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我烛亦,道長(zhǎng)诈泼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任煤禽,我火速辦了婚禮铐达,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檬果。我一直安慰自己瓮孙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布选脊。 她就那樣靜靜地躺著杭抠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恳啥。 梳的紋絲不亂的頭發(fā)上偏灿,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音钝的,去河邊找鬼菩混。 笑死忿墅,一個(gè)胖子當(dāng)著我的面吹牛扁藕,可吹牛的內(nèi)容都是我干的沮峡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亿柑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼邢疙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起望薄,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤疟游,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后痕支,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颁虐,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年卧须,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了另绩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡花嘶,死狀恐怖笋籽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椭员,我是刑警寧澤车海,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站隘击,受9級(jí)特大地震影響侍芝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埋同,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一州叠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莺禁,春花似錦留量、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽础钠。三九已至,卻和暖如春可岂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翰灾。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工缕粹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稚茅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓平斩,卻偏偏與公主長(zhǎng)得像亚享,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绘面,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 欺税? MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,520評(píng)論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理揭璃,服務(wù)發(fā)現(xiàn)晚凿,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 輸出映射接下來說說有關(guān)Mapper.xml配置文件中查詢標(biāo)簽中關(guān)于返回值類型resultType與resultMa...
    默默無痕閱讀 13,834評(píng)論 1 10
  • MyBatis 真正的力量是在映射語句中瘦馍。這里是奇跡發(fā)生的地方歼秽。對(duì)于所有的力量,SQL 映射的 XML 文件是相當(dāng)...
    zhDoveLie閱讀 816評(píng)論 1 0
  • 2017年6月18日21:30燥筷,著名相聲表演藝術(shù)家唐杰忠在朝陽門中西醫(yī)急救中心因病醫(yī)治無效,不幸逝世呻惕,享年85歲荆责。...
    我非衣閱讀 510評(píng)論 0 1