MyBatis-21MyBatis高级结果映射【一对多映射(2种方式)】
文章目錄
- 概述
- collection集合的嵌套結(jié)果映射
- SysUse實體類改造
- UserMapper接口增加接口方法
- UserMapper.xml
- 單元測試
- MyBatis的處理規(guī)則
- 兩層嵌套
- PrivilegeMap.xml增加映射
- SysRole實體類改造
- RoleMapper.xml文件中增加如下resultMap
- UserMapper.xml改造
- 單元測試
- collection集合的嵌套查詢
概述
MyBatis-20MyBatis高級結(jié)果映射【一對一映射(4種方式)】中我們介紹了4種方式實現(xiàn)一對一映射,本篇博文,一對多映射只有兩種配置方式,都是使用collection標簽進行的。
collection集合的嵌套結(jié)果映射
和association類似,集合的嵌套結(jié)果映射就是通過一次SQL查詢將所有的結(jié)果查詢出來,然后通過配置的結(jié)果映射,將數(shù)據(jù)映射到不同的對象中取。 在一對多的關(guān)系中,主表的一條數(shù)據(jù)會對應(yīng)關(guān)聯(lián)表中的多條數(shù)據(jù),因此一般查詢時會查詢出多個結(jié)果,按照一對多的數(shù)據(jù)結(jié)果存儲數(shù)據(jù)的時候,最終的結(jié)果會小于等于查詢的總記錄數(shù)。
在RBAC權(quán)限系統(tǒng)中,一個用戶用于多個角色(在使用association是設(shè)定的特例,現(xiàn)在一個用戶只能有一個角色),每個角色又是多個權(quán)限的集合,所以要漸進式的去實現(xiàn)一個SQL,查詢出所有用戶和用戶擁有的角色,以及角色所包含的所有權(quán)限信息的兩層嵌套結(jié)果。
SysUse實體類改造
為了能夠存儲一對多的數(shù)據(jù),先對SysUser類進行修改
增加
public class SysUser{// 原有屬性, setter getter保持不變 /*** 用戶角色: 一個用戶擁有多個角色 , 一對多*/private List<SysRole> roleList;public List<SysRole> getRoleList() {return roleList;}public void setRoleList(List<SysRole> roleList) {this.roleList = roleList;}}UserMapper接口增加接口方法
/*** * * @Title: selectAllUserAndRoles* * @Description:獲取所有用戶及對應(yīng)的角色* * @return* * @return: List<SysUser>*/List<SysUser> selectAllUserAndRoles();UserMapper.xml
<!-- 簡化的配置 --><resultMap id="userRoleListMap" extends="userMap"type="com.artisan.mybatis.xml.domain.SysUser" ><!-- sysRole相關(guān)的屬性 property 對應(yīng)實體類List<SysRole>屬性名--><collection property="roleList" columnPrefix="sysRole_"resultMap="roleMap"></collection></resultMap><select id="selectAllUserAndRoles" resultMap="userRoleListMap">SELECTu.id,u.user_name ,u.user_password ,u.user_email ,u.user_info ,u.create_time ,u.head_img ,r.id sysRole_id,r.role_name sysRole_role_name,r.enabled sysRole_enabled,r.create_by sysRole_create_by,r.create_time sysRole_create_timeFROMsys_user uINNER JOIN sys_user_role ur ON u.id = ur.user_idINNER JOIN sys_role r ON ur.role_id = r.id</select>和一對一映射相比,一對多的userRoleListMap,就是把association改成collection, 然后將property設(shè)置為roleList,其他的屬性保持不變。
collection用于配置一對多的關(guān)系,對應(yīng)的屬性必須是對象中的集合類型,因此這里是roleList。 另外resultMap只是為了配置數(shù)據(jù)庫字段和實體屬性的映射關(guān)系,因此其他都一樣。 同時能存儲一對多的數(shù)據(jù)結(jié)構(gòu)肯定也能存儲一對一的關(guān)系,所以一對一是一對多的一種特例。 collection支持的屬性以及屬性的作用和association完全相同。
為了簡化配置,我們通過繼承userMap來使用sys_user的映射關(guān)系,同時我們在UserMapper.xml中配置了roleMap的映射關(guān)系(更加合適的問題應(yīng)該在RoleMapper.xml中,如果在RoleMapper.xml中,引用的時候一定要加上命名空間),因此直接飲用roleMap ,經(jīng)過這兩個方式的簡化,最終的userRoleListMap如上
總結(jié)下:一對多配置變化的地方是 association變?yōu)閏ollection, property由role變?yōu)榱藃oleList
單元測試
@Testpublic void selectAllUserAndRolesTest() {logger.info("selectAllUserAndRolesTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 調(diào)用selectAll,查詢?nèi)坑脩?/span>List<SysUser> userList = userMapper.selectAllUserAndRoles();// 結(jié)果不為空Assert.assertNotNull(userList);// 結(jié)果大于0Assert.assertTrue(userList.size() > 0);logger.info("userList總數(shù)為:" + userList.size());for (SysUser sysUser : userList) {logger.info("用戶名:" + sysUser.getUserName());for (SysRole sysRole : sysUser.getRoleList()) {logger.info("\t角色名:" + sysRole.getRoleName());}}} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}我們在 Assert.assertNotNull(userList); 加上個斷點,debug看下數(shù)據(jù)
點進去一個看下
從上圖可以看到一個用于已經(jīng)擁有兩個角色,實現(xiàn)了一對多的查詢。
接下來看下日志
2018-05-02 02:02:26,338 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-05-02 02:02:26,343 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-05-02 02:02:26,346 INFO [main] (UserMapperTest.java:1133) - selectAllUserAndRolesTest 2018-05-02 02:02:26,415 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT u.id, u.user_name , u.user_password , u.user_email , u.user_info , u.create_time , u.head_img , r.id sysRole_id, r.role_name sysRole_role_name, r.enabled sysRole_enabled, r.create_by sysRole_create_by, r.create_time sysRole_create_time 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 2018-05-02 02:02:26,538 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 2018-05-02 02:02:26,586 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, user_name, user_password, user_email, user_info, create_time, head_img, sysRole_id, sysRole_role_name, sysRole_enabled, sysRole_create_by, sysRole_create_time 2018-05-02 02:02:26,587 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 1, 管理員, 1, 1, 2018-04-13 21:12:46.0 2018-05-02 02:02:26,598 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0 2018-05-02 02:02:26,600 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0 2018-05-02 02:02:26,602 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 3 2018-05-02 02:02:26,604 INFO [main] (UserMapperTest.java:1146) - userList總數(shù)為:2 2018-05-02 02:02:26,604 INFO [main] (UserMapperTest.java:1148) - 用戶名:admin 2018-05-02 02:02:26,604 INFO [main] (UserMapperTest.java:1150) - 角色名:管理員 2018-05-02 02:02:26,605 INFO [main] (UserMapperTest.java:1150) - 角色名:普通用戶 2018-05-02 02:02:26,605 INFO [main] (UserMapperTest.java:1148) - 用戶名:artisan 2018-05-02 02:02:26,605 INFO [main] (UserMapperTest.java:1150) - 角色名:普通用戶 2018-05-02 02:02:26,608 INFO [main] (UserMapperTest.java:1157) - sqlSession close successfullyMyBatis的處理規(guī)則
通過日志可以清楚地看到,SQL執(zhí)行的結(jié)果數(shù)有3條,用戶輸出的數(shù)量確實2條,也就是說本來查詢出的3條結(jié)果經(jīng)過MyBatis對collection數(shù)據(jù)的處理后,變成了2條。
從日志中,我們知道第一個用戶擁有兩個角色,所以轉(zhuǎn)換為一對多的數(shù)據(jù)結(jié)構(gòu)后就變成了兩套結(jié)果,那么 MyBatis又是怎么知道要處理成這樣的結(jié)果呢?
先來看MyBatis是如何要知道合并admin的兩條數(shù)據(jù)的,為什么不把test這條數(shù)據(jù)也合并進去呢?
MyBatis在處理結(jié)果的時候,會判斷結(jié)果是否相同,如果是相同的結(jié)果,則只會保留第一個結(jié)果。 所以這個問題的關(guān)鍵點就是MyBatis是如何判斷結(jié)果是否相同。 最簡單的情況就是在映射配置中至少有一個id標簽
<id property="id" column="id" />我們對id的理解一般是,它配置的字段為表的主鍵(聯(lián)合主鍵時可以配置多個id標簽),因為MyBatis的resultMap只用于配置結(jié)果如何映射,并不知道這個表具體如何。 id的唯一作用就是在嵌套的映射配置中判斷數(shù)據(jù)是否相同。 .當配置id標簽時,MyBatis只需要逐條比較所有數(shù)據(jù)中id標簽的字段值是否相同即可。 在配置嵌套結(jié)果查詢時,配置id標簽提高處理效率。
這樣一來,上面的查詢就不難理解了,因為前兩套數(shù)據(jù)的userMap部分的id相同,所以他們屬于同一個用戶,因子這條數(shù)據(jù)會合并到同一個用戶中。
為了更加清楚的理解id的作用,我們隊userMap的映射進行如下修改。
<resultMap id="userMap" type="com.artisan.mybatis.xml.domain.SysUser"><id property="userPassword" column="userPassword" /><result property="userName" column="user_name" /><result property="userPassword" column="user_password" /><result property="userEmail" column="user_email" /><result property="userInfo" column="user_info" /><result property="headImg" column="head_img" jdbcType="BLOB" /><result property="createTime" column="create_time" jdbcType="TIMESTAMP" /></resultMap>在測試數(shù)據(jù)中,用戶的密碼均為 123456
如果把密碼最為id,按照上面的邏輯,3條數(shù)據(jù)就會合并為1條數(shù)據(jù),修改后,再次執(zhí)行單元測試。
2018-05-02 12:24:27,161 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-05-02 12:24:27,161 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-05-02 12:24:27,173 INFO [main] (UserMapperTest.java:1133) - selectAllUserAndRolesTest 2018-05-02 12:24:27,253 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT u.id, u.user_name , u.user_password , u.user_email , u.user_info , u.create_time , u.head_img , r.id sysRole_id, r.role_name sysRole_role_name, r.enabled sysRole_enabled, r.create_by sysRole_create_by, r.create_time sysRole_create_time 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 2018-05-02 12:24:27,383 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 2018-05-02 12:24:27,433 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, user_name, user_password, user_email, user_info, create_time, head_img, sysRole_id, sysRole_role_name, sysRole_enabled, sysRole_create_by, sysRole_create_time 2018-05-02 12:24:27,433 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 1, 管理員, 1, 1, 2018-04-13 21:12:46.0 2018-05-02 12:24:27,443 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0 2018-05-02 12:24:27,443 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, 2018-04-13 21:12:47.0, <<BLOB>>, 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0 2018-05-02 12:24:27,443 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 3 2018-05-02 12:24:27,443 INFO [main] (UserMapperTest.java:1146) - userList總數(shù)為:1 2018-05-02 12:24:27,443 INFO [main] (UserMapperTest.java:1148) - 用戶名:admin 2018-05-02 12:24:27,443 INFO [main] (UserMapperTest.java:1150) - 角色名:管理員 2018-05-02 12:24:27,443 INFO [main] (UserMapperTest.java:1150) - 角色名:普通用戶 2018-05-02 12:24:27,443 INFO [main] (UserMapperTest.java:1157) - sqlSession close successfully userList總數(shù)為:1用戶名:admin角色名:管理員角色名:普通用戶用戶信心保留的是第一條數(shù)據(jù)的信心,因此用戶名是admin . 角色為什么不是3個呢? 因為“普通用戶”這個角色重復了,所以也只保留第一個出現(xiàn)的“普通用戶”。 因為MyBatis會對嵌套查詢的每一級對象都進行屬性比較。 MyBatis會首先比較頂層的對象,如果SysUser相同,就繼續(xù)比較SysRole部分,如果SysRole不同,就會增加一個sysRole,兩個SysROle相同就保留前一個。 假設(shè)SysRole還有下一級,仍然按照該規(guī)則去比較。
通過上述這個例子應(yīng)該明白了id的作用了,需要注意的是,很肯能出現(xiàn)一種沒有配置id的情況。 當沒有配置id的時候,MyBatis就會把resultMap中配置的說喲字段進行比較,如果所有字段的值都相同就合并,只要有一個字段值不同,就不合并。
在嵌套結(jié)果配置id屬性時,如果查詢中沒有查詢id屬性配置的列,就會導致id對應(yīng)的值為null.這種情況下,所有的id都相同,因此會使嵌套的集合中只有一條數(shù)據(jù)。 所以在配置id列時,查詢語句中必須包含該列。
可以對userMap再次改造,將id標簽改為result標簽,執(zhí)行結(jié)果是一樣的,由于MyBatis要對所有字段字段進行比較,因此當字段數(shù)為M時,如果查詢結(jié)果有N條,就需要進行M*N,相比配置id時的N次比較,效率差很多。 所以盡量配置id標簽.
<result property="id" column="id"/>兩層嵌套
在RBAC權(quán)限系統(tǒng)中,除了一個用戶對應(yīng)多個角色外,每個角色還會對應(yīng)多個權(quán)限,在上個例子的基礎(chǔ)上我們增加一級,獲取角色對應(yīng)的所有權(quán)限。
PrivilegeMap.xml增加映射
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><!-- 當Mapper接口和XML文件關(guān)聯(lián)的時候, namespace的值就需要配置成接口的全限定名稱 --> <mapper namespace="com.artisan.mybatis.xml.mapper.PrivilegeMapper"><resultMap id="privilegeMap" type="com.artisan.mybatis.xml.domain.SysPrivilege"><id property="id" column="id" /><result property="privilegeName" column="privilege_name" /><result property="privilegeUrl" column="privilege_url" /></resultMap> </mapper>SysRole實體類改造
增加
/*** 一對多,權(quán)限集合*/List<SysPrivilege> privilegeList;public List<SysPrivilege> getPrivilegeList() {return privilegeList;}public void setPrivilegeList(List<SysPrivilege> privilegeList) {this.privilegeList = privilegeList;}RoleMapper.xml文件中增加如下resultMap
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <!-- 當Mapper接口和XML文件關(guān)聯(lián)的時候, namespace的值就需要配置成接口的全限定名稱 --> <mapper namespace="com.artisan.mybatis.xml.mapper.RoleMapper"><resultMap id="rolePrivilegeListMap" type="com.artisan.mybatis.xml.domain.SysRole"extends="com.artisan.mybatis.xml.mapper.UserMapper.roleMap"><collection property="privilegeList" columnPrefix="privilege_"resultMap="com.artisan.mybatis.xml.mapper.PrivilegeMapper.privilegeMap" /></resultMap> </mapper>我們創(chuàng)建了角色權(quán)限映射,繼承了roleMap,嵌套了privilegeList屬性,直接使用PrivilegeMapper.xml中的privilegeMap。
UserMapper.xml改造
<resultMap id="userRoleAndPrivilegeListMap" extends="userMap"type="com.artisan.mybatis.xml.domain.SysUser" ><collection property="roleList" columnPrefix="sysRole_"resultMap="com.artisan.mybatis.xml.mapper.RoleMapper.rolePrivilegeListMap"></collection></resultMap>到這里我們就配置好了一個兩層嵌套的映射,為了得到權(quán)限信息,還需要修改SQL進行關(guān)聯(lián)
<select id="selectAllUserAndRolesAndPrivileges" resultMap="userRoleAndPrivilegeListMap">select u.id, u.user_name, u.user_password,u.user_email,u.user_info,u.head_img,u.create_time,r.id sysRole_id,r.role_name sysRole_role_name, r.enabled sysRole_enabled,r.create_by sysRole_create_by,r.create_time sysRole_create_time,p.id sysRole_privilege_id,p.privilege_name sysRole_privilege_privilege_name,p.privilege_url sysRole_privilege_privilege_urlfrom sys_user uinner join sys_user_role ur on u.id = ur.user_idinner join sys_role r on ur.role_id = r.idinner join sys_role_privilege rp on rp.role_id = r.idinner join sys_privilege p on p.id = rp.privilege_id</select>這里需要特別注意sys_privilege表中的別名。因為sys_privilege嵌套在rolePrivilegeListMap中,前綴名是 privilege_
而rolePrivilegeListMap的前綴是sysRole_
所以rolePrivilegeListMap中的privilegeMap的前綴就變測過了 sysRole_privilege_
在嵌套中,這個前綴需要疊加,一定不要寫錯,所以SQL如下
單元測試
@Testpublic void selectAllUserAndRolesAndPrivilegesTest() {logger.info("selectAllUserAndRolesAndPrivilegesTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 調(diào)用selectAll,查詢?nèi)坑脩?/span>List<SysUser> userList = userMapper.selectAllUserAndRolesAndPrivileges();// 結(jié)果不為空Assert.assertNotNull(userList);// 結(jié)果大于0Assert.assertTrue(userList.size() > 0);logger.info("userList總數(shù)為:" + userList.size());for (SysUser sysUser : userList) {logger.info("用戶名:" + sysUser.getUserName());for (SysRole sysRole : sysUser.getRoleList()) {logger.info("\t角色名:" + sysRole.getRoleName());for (SysPrivilege sysPrivilege : sysRole.getPrivilegeList()) {logger.info("\t\t權(quán)限名:" + sysPrivilege.getPrivilegeName());}}}} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}Assert.assertNotNull(userList); 加個斷點,debug看下數(shù)據(jù)
日志
2018-05-02 20:10:08,202 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-05-02 20:10:08,207 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-05-02 20:10:08,211 INFO [main] (UserMapperTest.java:1164) - selectAllUserAndRolesAndPrivilegesTest 2018-05-02 20:10:08,287 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: select u.id, u.user_name, u.user_password, u.user_email, u.user_info, u.head_img, u.create_time, r.id sysRole_id, r.role_name sysRole_role_name, r.enabled sysRole_enabled, r.create_by sysRole_create_by, r.create_time sysRole_create_time, p.id sysRole_privilege_id, p.privilege_name sysRole_privilege_privilege_name, p.privilege_url sysRole_privilege_privilege_url 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 inner join sys_role_privilege rp on rp.role_id = r.id inner join sys_privilege p on p.id = rp.privilege_id 2018-05-02 20:10:08,411 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 2018-05-02 20:10:08,448 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time, sysRole_id, sysRole_role_name, sysRole_enabled, sysRole_create_by, sysRole_create_time, sysRole_privilege_id, sysRole_privilege_privilege_name, sysRole_privilege_privilege_url 2018-05-02 20:10:08,449 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0, 1, 管理員, 1, 1, 2018-04-13 21:12:46.0, 1, 用戶管理, /users 2018-05-02 20:10:08,466 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0, 1, 管理員, 1, 1, 2018-04-13 21:12:46.0, 3, 系統(tǒng)日志, /logs 2018-05-02 20:10:08,468 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0, 1, 管理員, 1, 1, 2018-04-13 21:12:46.0, 2, 角色管理, /roles 2018-05-02 20:10:08,469 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0, 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0, 4, 人員維護, /persons 2018-05-02 20:10:08,473 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0, 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0, 5, 單位維護, /companies 2018-05-02 20:10:08,475 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0, 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0, 4, 人員維護, /persons 2018-05-02 20:10:08,477 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0, 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0, 5, 單位維護, /companies 2018-05-02 20:10:08,478 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 7 2018-05-02 20:10:08,479 INFO [main] (UserMapperTest.java:1177) - userList總數(shù)為:2 2018-05-02 20:10:08,479 INFO [main] (UserMapperTest.java:1179) - 用戶名:admin 2018-05-02 20:10:08,482 INFO [main] (UserMapperTest.java:1181) - 角色名:管理員 2018-05-02 20:10:08,482 INFO [main] (UserMapperTest.java:1183) - 權(quán)限名:用戶管理 2018-05-02 20:10:08,482 INFO [main] (UserMapperTest.java:1183) - 權(quán)限名:系統(tǒng)日志 2018-05-02 20:10:08,482 INFO [main] (UserMapperTest.java:1183) - 權(quán)限名:角色管理 2018-05-02 20:10:08,483 INFO [main] (UserMapperTest.java:1181) - 角色名:普通用戶 2018-05-02 20:10:08,483 INFO [main] (UserMapperTest.java:1183) - 權(quán)限名:人員維護 2018-05-02 20:10:08,483 INFO [main] (UserMapperTest.java:1183) - 權(quán)限名:單位維護 2018-05-02 20:10:08,483 INFO [main] (UserMapperTest.java:1179) - 用戶名:artisan 2018-05-02 20:10:08,483 INFO [main] (UserMapperTest.java:1181) - 角色名:普通用戶 2018-05-02 20:10:08,484 INFO [main] (UserMapperTest.java:1183) - 權(quán)限名:人員維護 2018-05-02 20:10:08,484 INFO [main] (UserMapperTest.java:1183) - 權(quán)限名:單位維護 2018-05-02 20:10:08,485 INFO [main] (UserMapperTest.java:1191) - sqlSession close successfullycollection集合的嵌套查詢
同association關(guān)聯(lián)的嵌套查詢這種方式類似,collection也會執(zhí)行額外的SQL查詢。 后續(xù)單開篇介紹。
總結(jié)
以上是生活随笔為你收集整理的MyBatis-21MyBatis高级结果映射【一对多映射(2种方式)】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis-20MyBatis高级结
- 下一篇: MyBatis-22MyBatis缓存配