MyBatis-03 MyBatis XML方式之select元素
- 概述
- select用法
- 根據用戶id查詢用戶信息
- 1.UserMapper接口中添加接口方法
- 2. UserMapper.xml中配置resultMap和select元素
- 查詢全部的SysUser
- 添加接口方法
- 配置UserMapper.xml
- 單元測試
- 基礎測試類BaseMapperTest
- 全局屬性mapUnderscoreToCamelCase
- 1.增加UserMapper接口
- 2.配置UserMapper.xml
- 3.單元測試
- 多表關聯查詢
- 需求一: 根據用戶id返回該用戶所擁有的角色,返回的結果為角色集合,結果只有角色的信息即可,不用包含其他字段信息。
- 1.UserMapper接口增加接口方法
- 2. UserMapper.xml 配置語句
- 3. 單元測試
- 需求二:假設有個需求(僅僅為了說明用法):以需求一為基礎,不僅要包含sys_role的信息,同時還要包含當前用戶的部分信息(不考慮嵌套的情況)
- 1.SysRole添加 SysUser屬性
- 2.UserMapper.xml
- 3.單元測試
- 需求一: 根據用戶id返回該用戶所擁有的角色,返回的結果為角色集合,結果只有角色的信息即可,不用包含其他字段信息。
- 根據用戶id查詢用戶信息
- 小結
概述
擼完Mybatis-02Mybatis XML方式概述及配置步驟之后,準備工作準備完畢,就可以開始學習具體的用法了。我們先來看下select元素
select用法
權限系統中,幾個常見的業務,需要查詢出系統中的用戶、角色、權限等數據, 純JDBC時,需要寫查詢語句,并且對結果集進行手工處理,將結果映射到對象的屬性中。 而如果使用Mybatis,只需要在XML中添加一個select元素,寫一個SQL,做一些簡單的配置,就可以將結果集映射到對象中。
根據用戶id查詢用戶信息
1.UserMapper接口中添加接口方法
package com.artisan.mybatis.xml.mapper;import com.artisan.mybatis.xml.domain.SysUser;public interface UserMapper {/*** * * @Title: selectSysUserById* * @Description: 通過ID查詢系統用戶* * @param id* @return* * @return: SysUser*/SysUser selectSysUserById(Long id);}因為ID是主鍵,所以只可能查詢出一個SysUser ,所以selectSysUserById直接返回SysUser對象即可。
2. UserMapper.xml中配置resultMap和select元素
首先查看下數據庫SysUser的字段
再來看下SysUser實體類中的屬性
數據庫字段和實體類中的屬性名稱不一致,兩種方式
配置resultMap 映射 (selectSysUserById演示)
通過別名的方式 (selectAll 演示)
配置之前,先來探討一個問題: 前面創建接口和XML時提到過,接口和XML是通過將namespace設置為接口的全限定名來進行關聯的,那么接口中的方法和XML又是怎么關聯的呢?
Mybatis 是通過 xml中的select標簽的ID和接口名稱一致這種方式將接口方法和XML中定義的SQL語句關聯起來的,如果接口方法中沒有和XML 中的id屬性相對應的值,啟動程序便會報錯。
映射XML和接口的命名需要符合如下規范:
當只是用XML而不適用接口的時候,namespace的值可以設置為任意不重復的名稱
標簽的id屬性在任何時候都不能出現英文句號,并且同一個命名空間下不能出現重復的id
因為接口方法是可以重載的,所以接口中可以出現多個同名但參數不同的方法,但是xml中的id不能重復。
搞清了這些,我們來配置UserMapper.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文件關聯的時候, namespace的值就需要配置成接口的全限定名稱 --> <mapper namespace="com.artisan.mybatis.xml.mapper.UserMapper"><!-- 通過resultMap標簽配置Java對象和查詢結果列的對應關系 --><resultMap id="userMap" type="com.artisan.mybatis.xml.domain.SysUser"><id column="id" property="id" /><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><!-- 通過ID查詢系統用戶 --><select id="selectSysUserById" parameterType="Long" resultMap="userMap">selecta.id,a.user_name,a.user_password,a.user_email,a.user_info,a.head_img,a.create_timefromsys_user awhere id = #{id}</select></mapper>解釋下XML中的一些標簽和屬性的作用
<select>:映射查詢語句使用的標簽
id : 命名空間的唯一標示,代表這個語句
resultMap:用于設置返回值的類型和映射關系
#{id}: Mybatis SQL中使用預編譯參數的一種方式,大括號中的id是傳入的參數名。 表示使用preparedstatement設置占位符號并將輸入變量id傳到sql。
下面看下接口方法的返回值要如何定義
接口中定義的返回值類型必須和XML中配置的ResultType類型一致,否則就會因為類型不一致而拋出異常。 返回值類型是有XML中的resultType(或者resultMap中的type)決定的,不是由接口中所寫的返回值類型決定的(這里我們建的是XML方式,先忽略注解的情況)
查詢全部的SysUser
添加接口方法
/*** * * @Title: selectAll* * @Description: 查詢全部的SysUser* * @return* * @return: List<SysUser>*/List<SysUser> selectAll();配置UserMapper.xml
<!-- 通過全部的系統用戶 --><select id="selectAll" resultType="com.artisan.mybatis.xml.domain.SysUser">selecta.id id,a.user_name userName,a.user_password userPassword,a.user_email userEmail,a.user_info userInfo,a.head_img headImg,a.create_time createTimefromsys_user a</select>我們看到這個接口中對應方法的返回類型為 List<SysUser> , 為什么不是SysUser呢?
當返回值最多只有1個結果的時候(可以是0個),可以將接口返回值定義為SysUser,而不是List<SysUser>。
當執行的SQL返回多個結果時,必須使用List<SysUser> 或者SysUser[] 作為返回值,如果使用SysUser,會拋出TooManyResultsException異常。
觀察一下UserMapper.xml中的selectSysUserById和selectAll的區別
selectSysUserById使用了resultMap來設置結果映射,而selectAll使用resultType直接指定了返回結果的類型。 可以發現,如果使用resultType來設置返回結果的類型,需要在SQL中為所有列名和屬性名不一致的列設置別名,通過設置別名使最終的查詢結果和resultType指定對象的屬性名保持一致,進而實現自動映射.
單元測試
基礎測試類BaseMapperTest
這個類用于被繼承,主要功能是加載配置文件,提供獲取SqlSession的方法
在src/test/java中創建包 com.artisan.mybatis.xml.mapper
package com.artisan.mybatis.xml.mapper;import java.io.IOException; import java.io.Reader;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.log4j.Logger; import org.junit.BeforeClass;public class BaseMapperTest {private static Logger logger = Logger.getLogger(BaseMapperTest.class);private static SqlSessionFactory sessionFactory;@BeforeClasspublic static void init() {try {// 根據mybatis的配置文件創建sqlSessionFactoryString config = "mybatis-config.xml";Reader reader = Resources.getResourceAsReader(config);sessionFactory = new SqlSessionFactoryBuilder().build(reader);logger.info("sessionFactory bulit successfully");reader.close();logger.info("reader close successfully");} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession() {return sessionFactory.openSession();}} package com.artisan.mybatis.xml.mapper;import java.util.List;import org.apache.ibatis.session.SqlSession; import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Test;import com.artisan.mybatis.xml.domain.SysUser;/*** * * @ClassName: UserMapperTest* * @Description: UserMapperTest 單元測試類* * @author: Mr.Yang* * @date: 2018年4月14日 下午1:59:31*/ public class UserMapperTest extends BaseMapperTest {private static Logger logger = Logger.getLogger(UserMapperTest.class);@Testpublic void selectSysUserByIdTest() {logger.info("selectSysUserByIdTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 調用selectSysUserById方法,查詢id=1的用戶SysUser sysUser = userMapper.selectSysUserById((long) 1);// sysUser不為空Assert.assertNotNull(sysUser);// userName = "admin"Assert.assertEquals("admin", sysUser.getUserName());logger.info(sysUser);} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}@Testpublic void selectAllTest() {logger.info("selectAllTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 調用selectAll,查詢全部用戶List<SysUser> userList = userMapper.selectAll();// 結果不為空Assert.assertNotNull(userList);// 結果大于0Assert.assertTrue(userList.size() > 0);logger.info("userList總數為:" + userList.size());for (SysUser sysUser : userList) {logger.info(sysUser);}} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}}輸出日志:
2018-04-15 14:11:47,623 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-15 14:11:47,627 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-15 14:11:47,630 INFO [main] (UserMapperTest.java:29) - selectSysUserByIdTest 2018-04-15 14:11:48,258 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: select a.id, a.user_name, a.user_password, a.user_email, a.user_info, a.head_img, a.create_time from sys_user a where id = ? 2018-04-15 14:11:48,347 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long) 2018-04-15 14:11:48,379 TRACE [main] (BaseJdbcLogger.java:148) - <== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time 2018-04-15 14:11:48,380 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-15 14:11:48,385 DEBUG [main] (BaseJdbcLogger.java:142) - <== Total: 1 2018-04-15 14:11:48,386 INFO [main] (UserMapperTest.java:41) - SysUser [id=1, userName=admin, userPassword=123456, userEmail=admin@artisan.com, userInfo=管理員用戶, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018] 2018-04-15 14:11:48,392 INFO [main] (UserMapperTest.java:46) - sqlSession close successfully 2018-04-15 14:11:48,393 INFO [main] (UserMapperTest.java:52) - selectAllTest 2018-04-15 14:11:48,402 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: select a.id id, a.user_name userName, a.user_password userPassword, a.user_email userEmail, a.user_info userInfo, a.head_img headImg, a.create_time createTime from sys_user a 2018-04-15 14:11:48,403 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 2018-04-15 14:11:48,404 TRACE [main] (BaseJdbcLogger.java:148) - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime 2018-04-15 14:11:48,405 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-15 14:11:48,407 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 1001, test, 123456, test@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-15 14:11:48,412 DEBUG [main] (BaseJdbcLogger.java:142) - <== Total: 2 2018-04-15 14:11:48,412 INFO [main] (UserMapperTest.java:65) - userList總數為:2 2018-04-15 14:11:48,413 INFO [main] (UserMapperTest.java:67) - SysUser [id=1, userName=admin, userPassword=123456, userEmail=admin@artisan.com, userInfo=管理員用戶, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018] 2018-04-15 14:11:48,413 INFO [main] (UserMapperTest.java:67) - SysUser [id=1001, userName=test, userPassword=123456, userEmail=test@artisan.com, userInfo=測試用戶, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018] 2018-04-15 14:11:48,414 INFO [main] (UserMapperTest.java:73) - sqlSession close successfully全局屬性mapUnderscoreToCamelCase
在數據庫中,由于大部分數據庫設置不區分大小寫,一次下畫線方式的命名很常見,比如user_name, user_email . 在Java中,一般都是用駝峰式命名,比如userName,userEmail
因為數據庫和Java中的這兩種命名方式很常見,為此Mybatis提供了一個全局屬性mapUnderscoreToCamelCase,通過配置這個屬性為true可以自動將下畫線方式命名的數據庫列映射到java對象駝峰式命名屬性中。 這個屬性默認為false,若想使用,需要在mybatis全局配置文件中settings節點下增加如下配置
<!-- 通過配置這個屬性為true可以自動將下畫線方式命名的數據庫列映射到java對象駝峰式命名屬性中 --> <setting name="mapUnderscoreToCamelCase" value="true"/>1.增加UserMapper接口
// 僅僅是為了測試mapUnderscoreToCamelCase 全局屬性 SysUser selectUserByIdUseMapUnderscoreToCamelCase(Long id);2.配置UserMapper.xml
<!-- 通過ID查詢系統用戶 ,配合mapUnderscoreToCamelCase設置為true --> <select id="selectUserByIdUseMapUnderscoreToCamelCase" parameterType="Long" resultType="com.artisan.mybatis.xml.domain.SysUser">selecta.id,a.user_name,a.user_password,a.user_email,a.user_info,a.head_img,a.create_timefromsys_user awhere id = #{id}</select>注意使用的是resultType ,而不是resutlMap
3.單元測試
@Testpublic void selectUserByIdUseMapUnderscoreToCamelCaseTest() {logger.info("selectUserByIdUseMapUnderscoreToCamelCaseTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 調用selectSysUserById方法,查詢id=1的用戶SysUser sysUser = userMapper.selectUserByIdUseMapUnderscoreToCamelCase((long) 1001);// sysUser不為空Assert.assertNotNull(sysUser);// userName = "admin"Assert.assertEquals("test", sysUser.getUserName());logger.info(sysUser);} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}日志
2018-04-15 14:23:39,196 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-15 14:23:39,200 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-15 14:23:39,204 INFO [main] (UserMapperTest.java:79) - selectUserByIdUseMapUnderscoreToCamelCaseTest 2018-04-15 14:23:39,802 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: select a.id, a.user_name, a.user_password, a.user_email, a.user_info, a.head_img, a.create_time from sys_user a where id = ? 2018-04-15 14:23:39,896 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1001(Long) 2018-04-15 14:23:39,932 TRACE [main] (BaseJdbcLogger.java:148) - <== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time 2018-04-15 14:23:39,933 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 1001, test, 123456, test@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-15 14:23:39,936 DEBUG [main] (BaseJdbcLogger.java:142) - <== Total: 1 2018-04-15 14:23:39,939 INFO [main] (UserMapperTest.java:96) - sqlSession close successfully多表關聯查詢
需求一: 根據用戶id返回該用戶所擁有的角色,返回的結果為角色集合,結果只有角色的信息即可,不用包含其他字段信息。
根據我們的數據模型可知,涉及到3個表, sys_user 、sys_role 、sys_user_role 。
1.UserMapper接口增加接口方法
/*** * * @Title: selectRoleByUserId* * @Description: 根據用戶ID查詢用戶角色* * @param userId* @return* * @return: List<SysRole>*/List<SysRole> selectRoleListByUserId(Long userId);2. UserMapper.xml 配置語句
<!-- 根據用戶ID查詢用戶角色 --><select id="selectRoleListByUserId" parameterType="Long" resultType="com.artisan.mybatis.xml.domain.SysRole">SELECTc.id,c.role_name roleName,c.enabled,c.create_by createBy,c.create_time createTimeFROMsys_user aJOIN sys_user_role b ON a.id = b.user_idJOIN sys_role c ON b.role_id = c.idWHEREa.id = #{userId}</select>3. 單元測試
@Testpublic void selectRoleListByUserIdTest() {logger.info("selectRoleListByUserIdTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 調用selectRoleListByUserId方法,查詢用戶id=1的角色List<SysRole> roleList = userMapper.selectRoleListByUserId((long) 1);// roleList不為空Assert.assertNotNull(roleList);// roleList > 0Assert.assertTrue(roleList.size() > 0);logger.info(roleList);} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}選中方法名,運行單元測試
2018-04-15 15:45:39,368 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-15 15:45:39,373 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-15 15:45:39,377 INFO [main] (UserMapperTest.java:103) - selectRoleListByUserIdTest 2018-04-15 15:45:40,086 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: SELECT c.id, c.role_name roleName, c.enabled, c.create_by createBy, c.create_time createTime FROM sys_user a JOIN sys_user_role b ON a.id = b.user_id JOIN sys_role c ON b.role_id = c.id WHERE a.id = ? 2018-04-15 15:45:40,212 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long) 2018-04-15 15:45:40,262 TRACE [main] (BaseJdbcLogger.java:148) - <== Columns: id, roleName, enabled, createBy, createTime 2018-04-15 15:45:40,263 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 1, 管理員, 1, 1, 2018-04-13 21:12:46.0 2018-04-15 15:45:40,269 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0 2018-04-15 15:45:40,270 DEBUG [main] (BaseJdbcLogger.java:142) - <== Total: 2 2018-04-15 15:45:40,271 INFO [main] (UserMapperTest.java:116) - [SysRole [id=1, roleName=管理員, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null], SysRole [id=2, roleName=普通用戶, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]] 2018-04-15 15:45:40,287 INFO [main] (UserMapperTest.java:121) - sqlSession close successfully符合數據庫中的記錄 。
需求二:假設有個需求(僅僅為了說明用法):以需求一為基礎,不僅要包含sys_role的信息,同時還要包含當前用戶的部分信息(不考慮嵌套的情況)
比如增加查詢列 user_name , user_email 這個時候該如何設置resultType呢?
兩種簡單的方法
第一種方法是在SysRole對象中直接添加userName,userEmail屬性,這樣仍然使用SysRole作為返回值
第二種方法創建一個子類繼承SysRole,將userName,userEmail作為子類的屬性,將resultType的返回對象設置為子類 。 (這種方式適合在需要少量的額外字段時使用,如果需要其他表中大量列的時候就不合適了。)
在不考慮嵌套XML配置的情況下,我們來演示下第一種方法
1.SysRole添加 SysUser屬性
/** * 用戶信息 */ private SysUser user;setter/getter2.UserMapper.xml
增加
<!-- 根據用戶ID查詢用戶角色 ,增加sys_user中的部分字段 --><select id="selectRoleListByUserIdMoreInfo" parameterType="Long" resultType="com.artisan.mybatis.xml.domain.SysRole">SELECTc.id,c.role_name roleName,c.enabled,c.create_by createBy,c.create_time createTime,a.user_name as 'user.userName',a.user_email as 'user.userEmail'FROMsys_user aJOIN sys_user_role b ON a.id = b.user_idJOIN sys_role c ON b.role_id = c.idWHEREa.id = #{userId}</select>注意看查詢列增加的兩行
a.user_name as 'user.userName', a.user_email as 'user.userEmail'這里設置別名的時候,使用的是“user.屬性名”,user是SysRole中剛剛增加的屬性,userName和userEmail是SysUser對象的屬性,通過這種方式可以直接將值賦給user字段中的屬性
3.單元測試
@Testpublic void selectRoleListByUserIdMoreInfoTest() {logger.info("selectRoleListByUserIdMoreInfoTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 調用selectRoleListByUserId方法,查詢用戶id=1的角色List<SysRole> roleList = userMapper.selectRoleListByUserIdMoreInfo((long) 1);// roleList不為空Assert.assertNotNull(roleList);// roleList > 0Assert.assertTrue(roleList.size() > 0);logger.info(roleList);} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}日志
2018-04-15 17:56:06,453 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-15 17:56:06,457 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-15 17:56:06,460 INFO [main] (UserMapperTest.java:127) - selectRoleListByUserIdMoreInfoTest 2018-04-15 17:56:06,987 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Preparing: SELECT c.id, c.role_name roleName, c.enabled, c.create_by createBy, c.create_time createTime, a.user_name as 'user.userName', a.user_email as 'user.userEmail' FROM sys_user a JOIN sys_user_role b ON a.id = b.user_id JOIN sys_role c ON b.role_id = c.id WHERE a.id = ? 2018-04-15 17:56:07,085 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long) 2018-04-15 17:56:07,119 TRACE [main] (BaseJdbcLogger.java:148) - <== Columns: id, roleName, enabled, createBy, createTime, user.userName, user.userEmail 2018-04-15 17:56:07,119 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 1, 管理員, 1, 1, 2018-04-13 21:12:46.0, admin, admin@artisan.com 2018-04-15 17:56:07,124 TRACE [main] (BaseJdbcLogger.java:148) - <== Row: 2, 普通用戶, 1, 1, 2018-04-13 21:12:46.0, admin, admin@artisan.com 2018-04-15 17:56:07,126 DEBUG [main] (BaseJdbcLogger.java:142) - <== Total: 2 2018-04-15 17:56:07,126 INFO [main] (UserMapperTest.java:140) - [SysRole [id=1, roleName=管理員, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=SysUser [id=null, userName=admin, userPassword=null, userEmail=admin@artisan.com, userInfo=null, headImg=null, createTime=null], privilegeList=null], SysRole [id=2, roleName=普通用戶, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=SysUser [id=null, userName=admin, userPassword=null, userEmail=admin@artisan.com, userInfo=null, headImg=null, createTime=null], privilegeList=null]] 2018-04-15 17:56:07,133 INFO [main] (UserMapperTest.java:145) - sqlSession close successfully為了更加直觀,我們在Assert.assertNotNull(roleList); 加上斷點,調測一下,如下圖所示
小結
Select元素的用法總結到此,接下來我們來開啟insert元素的用法
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的MyBatis-03 MyBatis XML方式之select元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis-02 MyBatis X
- 下一篇: asp.net ajax控件工具集 Au