亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis中XML基本用法之多表查詢功能的示例分析

發布時間:2021-07-22 14:51:04 來源:億速云 閱讀:304 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“MyBatis中XML基本用法之多表查詢功能的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“MyBatis中XML基本用法之多表查詢功能的示例分析”這篇文章吧。

1. 多表查詢

在之前,我們示例的2個查詢都是單表查詢,但實際的業務場景肯定是需要多表查詢的,比如現在有個需求:

查詢某個用戶擁有的所有角色。這個需求要涉及到sys_user,sys_user_role,sys_role三張表,如何實現呢?

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

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

然后打開對應的SysUserMapper.xml文件,添加如下select語句:

<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>

細心的讀者可能會發現,我們雖然使用到了多表查詢,但是resultType設置的仍然是單表,即只包含角色表的信息。

如果我希望這個查詢語句同時返回SysUser表的user_name字段呢,該如何設置resultType?

方法1:直接在SysRole實體類中添加userName字段。

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

此時resultType不用修改。

方法2:新建擴展類,在擴展類中添加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;
 }
}

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

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

方法3:在SysRole實體類中添加SysUser類型的字段。

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

此時resultType不用修改。

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

書中推薦的是方式3,方式4是我個人認為更好的方式,因為實體類一般由工具自動生成,增加了字段后,后續容易忘記導致被覆蓋掉。

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;
 }
}

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

此時xml中的查詢語句如下。

<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中添加測試代碼如下。

@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();
 }
}

運行該測試方法,輸入日志如下。

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. 多個接口參數的用法

2.1 參數類型是基本類型

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

要么是只有1個對象作為參數,即將多個參數合并成了1個對象。

但有些場景下,比如只有2個參數,沒有必要為這2個參數再新建一個對象,比如我們現在需要根據用戶的id和角色的狀態來獲取用戶的所有角色,那么該如何使用呢?

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

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

然后,打開對應的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測試類中,添加如下測試方法。

@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();
 }
}

運行該測試方法,發現報如下錯誤。


MyBatis中XML基本用法之多表查詢功能的示例分析

報錯信息中說未找到參數userId,可用的參數是[0,1,param1,param2],也就是說我們將代碼修改為:

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

或者修改為:

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

這么使用是可以測試通過的,不過這樣使用,代碼閱讀起來不夠友好,因此并不推薦這么使用。

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

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

運行剛剛添加的測試方法,測試通過,輸出日志如下:

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 參數類型是對象

為了演示參數類型是對象的使用方法,我們在接口SysUserMapper中添加如下方法:

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

此時對應的xml中的語句為:

<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>

以上是“MyBatis中XML基本用法之多表查詢功能的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

星子县| 凌云县| 沙洋县| 波密县| 沈阳市| 岢岚县| 井研县| 凌云县| 扬州市| 保定市| 旺苍县| 泊头市| 禹州市| 彭水| 安阳市| 耿马| 荆州市| 德钦县| 云霄县| 尉氏县| 大方县| 萨嘎县| 同仁县| 汽车| 盐城市| 金坛市| 虹口区| 恩平市| 南木林县| 会泽县| 全南县| 黄山市| 安新县| 犍为县| 公主岭市| 阿鲁科尔沁旗| 和平县| 广灵县| 南岸区| 舟山市| 雅江县|