欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis XML方式的基本用法之多表查詢功能的示例代碼

 更新時(shí)間:2019年07月03日 10:36:48   作者:申城異鄉(xiāng)人  
這篇文章主要介紹了MyBatis XML方式的基本用法之多表查詢功能的示例代碼,本文通過(guò)示例文字相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1. 多表查詢

在之前,我們示例的2個(gè)查詢都是單表查詢,但實(shí)際的業(yè)務(wù)場(chǎng)景肯定是需要多表查詢的,比如現(xiàn)在有個(gè)需求:

查詢某個(gè)用戶擁有的所有角色。這個(gè)需求要涉及到sys_user,sys_user_role,sys_role三張表,如何實(shí)現(xiàn)呢?

首先,在SysUserMapper接口中定義如下方法。

/**
 * 根據(jù)用戶id獲取角色信息
 *
 * @param userId
 * @return
 */
List<SysRole> selectRolesByUserId(Long userId);

然后打開(kāi)對(duì)應(yīng)的SysUserMapper.xml文件,添加如下select語(yǔ)句:

<select id="selectRolesByUserId" resultType="com.zwwhnly.mybatisaction.model.SysRole">
 SELECT r.id,
  r.role_name roleName,
  r.enabled,
  r.create_by createBy,
  r.create_time createTime
 FROM sys_user u
 INNER JOIN sys_user_role ur ON u.id = ur.user_id
 INNER JOIN sys_role r ON ur.role_id = r.id
 WHERE u.id = #{userId}
</select>

細(xì)心的讀者可能會(huì)發(fā)現(xiàn),我們雖然使用到了多表查詢,但是resultType設(shè)置的仍然是單表,即只包含角色表的信息。

如果我希望這個(gè)查詢語(yǔ)句同時(shí)返回SysUser表的user_name字段呢,該如何設(shè)置resultType?

方法1:直接在SysRole實(shí)體類(lèi)中添加userName字段。

private String userName;
public String getUserName() {
 return userName;
}
public void setUserName(String userName) {
 this.userName = userName;
}

此時(shí)resultType不用修改。

方法2:新建擴(kuò)展類(lèi),在擴(kuò)展類(lèi)中添加userName字段。

package com.zwwhnly.mybatisaction.model;
public class SysRoleExtend extends SysRole {
 private String userName;
 public String getUserName() {
 return userName;
 }
 public void setUserName(String userName) {
 this.userName = userName;
 }
}

此時(shí)需要將resultType修改為:com.zwwhnly.mybatisaction.model.SysRoleExtend

這種方式比較適合需要少量額外字段的場(chǎng)景。如果需要其他表的大量字段,可以使用方式3或者方式4,個(gè)人推薦使用方式4。

方法3:在SysRole實(shí)體類(lèi)中添加SysUser類(lèi)型的字段。

private SysUser sysUser;
public SysUser getSysUser() {
 return sysUser;
}
public void setSysUser(SysUser sysUser) {
 this.sysUser = sysUser;
}

此時(shí)resultType不用修改。

方法4(推薦使用):新建擴(kuò)展類(lèi),在擴(kuò)展類(lèi)中添加SysUser類(lèi)型的字段。

書(shū)中推薦的是方式3,方式4是我個(gè)人認(rèn)為更好的方式,因?yàn)閷?shí)體類(lèi)一般由工具自動(dòng)生成,增加了字段后,后續(xù)容易忘記導(dǎo)致被覆蓋掉。

package com.zwwhnly.mybatisaction.model;
public class SysRoleExtend extends SysRole {
 private SysUser sysUser;
 public SysUser getSysUser() {
 return sysUser;
 }
 public void setSysUser(SysUser sysUser) {
 this.sysUser = sysUser;
 }
}

此時(shí)需要將resultType修改為:com.zwwhnly.mybatisaction.model.SysRoleExtend。

此時(shí)xml中的查詢語(yǔ)句如下。

<select id="selectRolesByUserId" resultType="com.zwwhnly.mybatisaction.model.SysRoleExtend">
 SELECT r.id,
  r.role_name roleName,
  r.enabled,
  r.create_by createBy,
  r.create_time createTime,
  u.user_name "sysUser.userName",
  u.user_email "sysUser.userEmail"
 FROM sys_user u
 INNER JOIN sys_user_role ur ON u.id = ur.user_id
 INNER JOIN sys_role r ON ur.role_id = r.id
 WHERE u.id = #{userId}
</select>

在SysUserMapperTest中添加測(cè)試代碼如下。

@Test
public void testSelectRolesByUserId() {
 SqlSession sqlSession = getSqlSession();
 try {
 SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
 List<SysRole> sysRoleList = sysUserMapper.selectRolesByUserId(1L);
 Assert.assertNotNull(sysRoleList);
 Assert.assertTrue(sysRoleList.size() > 0);
 } finally {
 sqlSession.close();
 }
}

運(yùn)行該測(cè)試方法,輸入日志如下。

DEBUG [main] - ==> Preparing: SELECT r.id, r.role_name roleName, r.enabled, r.create_by createBy, r.create_time createTime, u.user_name "sysUser.userName", u.user_email "sysUser.userEmail" FROM sys_user u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.id WHERE u.id = ?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, roleName, enabled, createBy, createTime, sysUser.userName, sysUser.userEmail
TRACE [main] - <== Row: 1, 管理員, 1, 1, 2019-06-27 18:21:12.0, admin, admin@mybatis.tk
TRACE [main] - <== Row: 2, 普通用戶, 1, 1, 2019-06-27 18:21:12.0, admin, admin@mybatis.tk
DEBUG [main] - <== Total: 2

2. 多個(gè)接口參數(shù)的用法

2.1 參數(shù)類(lèi)型是基本類(lèi)型

截止目前,我們定義的方法都只有1個(gè)參數(shù),要么是只有1個(gè)基本類(lèi)型的參數(shù),比如selectById(Long id);。

要么是只有1個(gè)對(duì)象作為參數(shù),即將多個(gè)參數(shù)合并成了1個(gè)對(duì)象。

但有些場(chǎng)景下,比如只有2個(gè)參數(shù),沒(méi)有必要為這2個(gè)參數(shù)再新建一個(gè)對(duì)象,比如我們現(xiàn)在需要根據(jù)用戶的id和角色的狀態(tài)來(lái)獲取用戶的所有角色,那么該如何使用呢?

首先,在接口SysUserMapper中添加如下方法。

/**
 * 根據(jù)用戶id和角色的enabled狀態(tài)獲取用戶的角色
 *
 * @param userId
 * @param enabled
 * @return
 */
List<SysRole> selectRolesByUserIdAndRoleEnabled(Long userId,Integer enabled);

然后,打開(kāi)對(duì)應(yīng)的SysUserMapper.xml文件,添加如下代碼。

<select id="selectRolesByUserIdAndRoleEnabled" resultType="com.zwwhnly.mybatisaction.model.SysRole">
 SELECT r.id,
  r.role_name roleName,
  r.enabled,
  r.create_by createBy,
  r.create_time createTime
 FROM sys_user u
 INNER JOIN sys_user_role ur ON u.id = ur.user_id
 INNER JOIN sys_role r ON ur.role_id = r.id
 WHERE u.id = #{userId} AND r.enabled = #{enabled}
</select>

在SysUserMapperTest測(cè)試類(lèi)中,添加如下測(cè)試方法。

@Test
public void testselectRolesByUserIdAndRoleEnabled() {
 SqlSession sqlSession = getSqlSession();
 try {
 SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
 List<SysRole> sysRoleList = sysUserMapper.selectRolesByUserIdAndRoleEnabled(1L, 1);
 Assert.assertNotNull(sysRoleList);
 Assert.assertTrue(sysRoleList.size() > 0);
 } finally {
 sqlSession.rollback();
 sqlSession.close();
 }
}

運(yùn)行該測(cè)試方法,發(fā)現(xiàn)報(bào)如下錯(cuò)誤。


報(bào)錯(cuò)信息中說(shuō)未找到參數(shù)userId,可用的參數(shù)是[0,1,param1,param2],也就是說(shuō)我們將代碼修改為:

WHERE u.id = #{0} AND r.enabled = #{1}

或者修改為:

WHERE u.id = #{param1} AND r.enabled = #{param2}

這么使用是可以測(cè)試通過(guò)的,不過(guò)這樣使用,代碼閱讀起來(lái)不夠友好,因此并不推薦這么使用。

推薦在接口方法的參數(shù)前添加@Param注解,如下所示:

/**
 * 根據(jù)用戶id和角色的enabled狀態(tài)獲取用戶的角色
 *
 * @param userId
 * @param enabled
 * @return
 */
List<SysRole> selectRolesByUserIdAndRoleEnabled(@Param("userId") Long userId, @Param("enabled") Integer enabled);

運(yùn)行剛剛添加的測(cè)試方法,測(cè)試通過(guò),輸出日志如下:

DEBUG [main] - ==> Preparing: SELECT r.id, r.role_name roleName, r.enabled, r.create_by createBy, r.create_time createTime FROM sys_user u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.id WHERE u.id = ? AND r.enabled = ?
DEBUG [main] - ==> Parameters: 1(Long), 1(Integer)
TRACE [main] - <== Columns: id, roleName, enabled, createBy, createTime
TRACE [main] - <== Row: 1, 管理員, 1, 1, 2019-06-27 18:21:12.0
TRACE [main] - <== Row: 2, 普通用戶, 1, 1, 2019-06-27 18:21:12.0
DEBUG [main] - <== Total: 2

2.2 參數(shù)類(lèi)型是對(duì)象

為了演示參數(shù)類(lèi)型是對(duì)象的使用方法,我們?cè)诮涌赟ysUserMapper中添加如下方法:

/**
 * 根據(jù)用戶id和角色的enabled狀態(tài)獲取用戶的角色
 *
 * @param user
 * @param role
 * @return
 */
List<SysRole> selectRolesByUserAndRole(@Param("user") SysUser user, @Param("role") SysRole role);

此時(shí)對(duì)應(yīng)的xml中的語(yǔ)句為:

<select id="selectRolesByUserAndRole" resultType="com.zwwhnly.mybatisaction.model.SysRole">
 SELECT r.id,
 r.role_name roleName,
 r.enabled,
 r.create_by createBy,
 r.create_time createTime
 FROM sys_user u
 INNER JOIN sys_user_role ur ON u.id = ur.user_id
 INNER JOIN sys_role r ON ur.role_id = r.id
 WHERE u.id = #{user.id} AND r.enabled = #{role.enabled}
</select>

3. 源碼

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

總結(jié)

以上所述是小編給大家介紹的MyBatis XML方式的基本用法之多表查詢功能的示例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Java常用加密算法實(shí)例總結(jié)

    Java常用加密算法實(shí)例總結(jié)

    這篇文章主要介紹了Java常用加密算法,結(jié)合實(shí)例形式總結(jié)分析了base64、md5、sha、rsa、des等加密算法實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-10-10
  • Spring AspectJ AOP框架注解原理解析

    Spring AspectJ AOP框架注解原理解析

    這篇文章主要介紹了Spring AspectJ AOP框架注解原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Springboot返回的json屏蔽某些屬性的操作

    Springboot返回的json屏蔽某些屬性的操作

    這篇文章主要介紹了Springboot返回的json屏蔽某些屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java中Object類(lèi)的理解和使用

    Java中Object類(lèi)的理解和使用

    Object類(lèi)是java.lang包下的核心類(lèi),Object類(lèi)是所有類(lèi)的父類(lèi),何一個(gè)類(lèi)時(shí)候如果沒(méi)有明確的繼承一個(gè)父類(lèi)的話,那么它就是Object的子類(lèi),本文將通過(guò)代碼示例詳細(xì)介紹一下Java中Object類(lèi)的理解和使用,需要的朋友可以參考下
    2023-06-06
  • SpringMVC中Invalid bound statement (not found)常見(jiàn)報(bào)錯(cuò)問(wèn)題解決

    SpringMVC中Invalid bound statement (not f

    本文主要介紹了SpringMVC中Invalid bound statement (not found)常見(jiàn)報(bào)錯(cuò)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java微信公眾平臺(tái)開(kāi)發(fā)(14) 微信web開(kāi)發(fā)者工具使用

    Java微信公眾平臺(tái)開(kāi)發(fā)(14) 微信web開(kāi)發(fā)者工具使用

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第十四步,微信web開(kāi)發(fā)者工具的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • java 合并排序算法、冒泡排序算法、選擇排序算法、插入排序算法、快速排序算法的描述

    java 合并排序算法、冒泡排序算法、選擇排序算法、插入排序算法、快速排序算法的描述

    算法是程序設(shè)計(jì)的精髓,程序設(shè)計(jì)的實(shí)質(zhì)就是構(gòu)造解決問(wèn)題的算法,將其解釋為計(jì)算機(jī)語(yǔ)言。
    2009-06-06
  • WebSocket實(shí)現(xiàn)系統(tǒng)后臺(tái)消息實(shí)時(shí)通知功能

    WebSocket實(shí)現(xiàn)系統(tǒng)后臺(tái)消息實(shí)時(shí)通知功能

    在現(xiàn)代Web應(yīng)用中,提供實(shí)時(shí)通知對(duì)于改善用戶體驗(yàn)至關(guān)重要,WebSocket技術(shù)允許建立雙向通信通道,從系統(tǒng)后臺(tái)將消息實(shí)時(shí)傳送給系統(tǒng)用戶,下面我們就來(lái)深入探討一下如何使用WebSocket來(lái)實(shí)現(xiàn)這一功能吧
    2023-10-10
  • java8 使用stream排序空字段排在前面或后面

    java8 使用stream排序空字段排在前面或后面

    這篇文章主要介紹了java8 使用stream排序空字段排在前面或后面的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件

    Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件

    這篇文章主要介紹了Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論