日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MyBatis-11MyBatis动态SQL之【if】

發布時間:2025/3/21 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis-11MyBatis动态SQL之【if】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 動態SQL概述
  • if概述
  • 在WHERE條件中使用if
    • 需求
    • 1.UserMapper接口中增加接口方法
    • 2.UserMapper.xml配置動態SQL
    • 3.單元測試
  • 在UPDATE條件中使用if
    • 需求
    • 1.UserMapper接口中增加接口方法
    • 2.UserMapper.xml配置動態SQL
    • 3.單元測試
  • 在INSERT動態插入列中使用if
    • 需求
    • 1.UserMapper接口中增加接口方法
    • 2.UserMapper.xml配置動態SQL
    • 3.單元測試

動態SQL概述

MyBatis的強大特性之一就是使用動態SQL,我們在使用JDBC的時候,根據不同的條件拼接SQL語句不僅不能忘了必要的空格,還要注意省略掉列名列表最后的逗號,處理方式顯得很繁瑣。 MyBatis的動態SQL則讓你擺脫這種痛苦。

在MyBatis3之前的版本,使用動態SQL需要學習很多標簽,現在MyBatis采用了強大的OGNL(Object Graph Navigation Language)表達式語言消除了許多其他的標簽。

以下是MyBatis的動態SQL在xml中支持的幾種標簽

  • if

  • choose(when、otherwise)

  • trim(where、set)

  • foreach

  • bind

本篇博文我們來探索下 【if】的用法


if概述

if標簽通常用于WHERE語句中,通過判斷參數來決定是否使用某個查詢條件,它也經常用于UPDATE語句中判斷是否更新某一個字段,還可以在INSERT中用來判斷是否插入某個字段的值。


在WHERE條件中使用if

需求

假設有個需求: 實現一個用戶管理的高級查詢功能,根據用戶輸入的條件去檢索用戶信息

  • 當用戶只輸入用戶名時,需要根據用戶名模糊查詢
  • 當用戶只輸入郵箱時,根據郵箱進行完全匹配
  • 當用戶同時輸入用戶名和密碼時,用這兩個條件查詢匹配的用戶

1.UserMapper接口中增加接口方法

/*** * * @Title: selectSysUsersAdvanced* * @Description: 根據動態條件查詢用戶信息* * @param sysUser* @return* * @return: List<SysUser>*/List<SysUser> selectSysUsersAdvanced(SysUser sysUser);

2.UserMapper.xml配置動態SQL

<select id="selectSysUsersAdvanced" resultType="com.artisan.mybatis.xml.domain.SysUser">SELECTa.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 aWHERE 1=1<if test="userName != null and userName != '' ">and user_name like concat('%',#{userName},'%')</if><if test="userEmail != null and userEmail != '' ">and user_email = #{userEmail}</if></select>

if標簽有一個必填的屬性test , test的屬性值是一個符合OGN要求的判斷表達式,表達式的結果可以為true或者false,除此之外所有非0值都為true,只有0為false。 不過建議在表達式中只用true或者false作為結果。

  • 判斷條件property != null 或者 property == null ,適用于任何類型的字段,判斷屬性值是否為空
  • 判斷條件property != ” 或者 property == ”,適用于String類型的字段,判斷屬性值是否為空
  • and 和 or :當有多個判斷條件時,使用and或者or進行連接,嵌套的判斷可以使用小括號分組,and 相當于 java中的 和(&&) , or相當于java中的或(||)

注意事項:

1. 注意SQL中where關鍵字后面的條件 where 1 = 1, 又有兩個條件都是動態的,如果沒有1=1這個默認條件,當兩個if都不滿足時,最后生成的SQL就會以where結束,不符合SQL規范,會報錯,因此加上 1 = 1這個條件可以避免SQL語法錯誤導致的異常。 這種寫法并不美觀,后續介紹使用where標簽替換這種寫法。

2. 注意條件中的 and(或者 or):當這部分條件拼接到where 1 = 1 后面時仍然是合法的SQL。因為有默認的1=1這個條件,我們才不需要判斷第一個動態條件是否需要加上and(或者or)。 因為這種情況下and(或者or)是必須有的


3.單元測試

@Testpublic void selectSysUsersAdvancedTest() {logger.info("selectSysUsersAdvanced");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();List<SysUser> userList = null;try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);logger.info("===========1.當用戶只輸入用戶名時,需要根據用戶名模糊查詢===========");// 模擬前臺傳參 1.當用戶只輸入用戶名時,需要根據用戶名模糊查詢SysUser sysUser = new SysUser();sysUser.setUserName("ad");// 調用selectSysUsersAdvanced,根據查詢條件查詢用戶userList = userMapper.selectSysUsersAdvanced(sysUser);// 根據數據庫sys_user表中的記錄,可以匹配到admin, 期望userList不為空Assert.assertNotNull(userList);// 根據查詢條件,期望只有1條數據Assert.assertTrue(userList.size() == 1);logger.info("userList:" + userList);// 為了測試 匹配多條記錄的情況,我們將id=1001這條數據的userName 由test 改為artisansysUser.setUserName("i");// 調用selectSysUsersAdvanced,根據查詢條件查詢用戶userList = userMapper.selectSysUsersAdvanced(sysUser);// 根據數據庫sys_user表中的記錄,可以匹配到admin和artisan, 期望userList不為空Assert.assertNotNull(userList);// 根據查詢條件,期望只有2條數據Assert.assertTrue(userList.size() == 2);logger.info("userList:" + userList);logger.info("===========2.當用戶只輸入郵箱使,根據郵箱進行完全匹配===========");// 模擬前臺傳參 2.當用戶只輸入郵箱使,根據郵箱進行完全匹配sysUser.setUserEmail("admin@artisan.com");userList = userMapper.selectSysUsersAdvanced(sysUser);Assert.assertNotNull(userList);Assert.assertTrue(userList.size() == 1);logger.info(userList);sysUser.setUserEmail("1admin@artisan.com");userList = userMapper.selectSysUsersAdvanced(sysUser);Assert.assertTrue(userList.size() == 0);logger.info("===========當用戶同時輸入用戶名和密碼時,用這兩個條件查詢匹配的用戶===========");// 模擬組合查詢條件,存在記錄的情況sysUser.setUserName("i");sysUser.setUserEmail("admin@artisan.com");userList = userMapper.selectSysUsersAdvanced(sysUser);Assert.assertNotNull(userList);Assert.assertEquals("admin@artisan.com", sysUser.getUserEmail());Assert.assertTrue(userList.size() == 1);logger.info(userList);// 模擬組合查詢條件,不存在記錄的情況sysUser.setUserName("x");sysUser.setUserEmail("admin@artisan.com");userList = userMapper.selectSysUsersAdvanced(sysUser);Assert.assertTrue(userList.size() == 0);logger.info(userList);} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}

日志

2018-04-21 02:01:38,930 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-21 02:01:38,934 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-21 02:01:38,944 INFO [main] (UserMapperTest.java:356) - selectSysUsersAdvanced 2018-04-21 02:01:38,981 INFO [main] (UserMapperTest.java:365) - ===========1.當用戶只輸入用戶名時,需要根據用戶名模糊查詢=========== 2018-04-21 02:01:39,533 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT a.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 WHERE 1=1 and user_name like concat('%',?,'%') 2018-04-21 02:01:39,606 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: ad(String) 2018-04-21 02:01:39,639 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime 2018-04-21 02:01:39,640 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-21 02:01:39,651 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1 2018-04-21 02:01:39,658 INFO [main] (UserMapperTest.java:375) - userList:[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-21 02:01:39,658 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT a.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 WHERE 1=1 and user_name like concat('%',?,'%') 2018-04-21 02:01:39,659 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: i(String) 2018-04-21 02:01:39,661 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime 2018-04-21 02:01:39,661 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-21 02:01:39,662 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-21 02:01:39,664 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 2 2018-04-21 02:01:39,666 INFO [main] (UserMapperTest.java:386) - userList:[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], SysUser [id=1001, userName=artisan, userPassword=123456, userEmail=test@artisan.com, userInfo=測試用戶, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018]] 2018-04-21 02:01:39,667 INFO [main] (UserMapperTest.java:388) - ===========2.當用戶只輸入郵箱使,根據郵箱進行完全匹配=========== 2018-04-21 02:01:39,667 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT a.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 WHERE 1=1 and user_name like concat('%',?,'%') and user_email = ? 2018-04-21 02:01:39,668 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: i(String), admin@artisan.com(String) 2018-04-21 02:01:39,669 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime 2018-04-21 02:01:39,670 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-21 02:01:39,671 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1 2018-04-21 02:01:39,671 INFO [main] (UserMapperTest.java:394) - [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-21 02:01:39,672 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT a.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 WHERE 1=1 and user_name like concat('%',?,'%') and user_email = ? 2018-04-21 02:01:39,673 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: i(String), 1admin@artisan.com(String) 2018-04-21 02:01:39,674 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 0 2018-04-21 02:01:39,675 INFO [main] (UserMapperTest.java:400) - ===========當用戶同時輸入用戶名和密碼時,用這兩個條件查詢匹配的用戶=========== 2018-04-21 02:01:39,675 INFO [main] (UserMapperTest.java:409) - [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-21 02:01:39,676 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT a.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 WHERE 1=1 and user_name like concat('%',?,'%') and user_email = ? 2018-04-21 02:01:39,677 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: x(String), admin@artisan.com(String) 2018-04-21 02:01:39,679 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 0 2018-04-21 02:01:39,679 INFO [main] (UserMapperTest.java:416) - [] 2018-04-21 02:01:39,681 INFO [main] (UserMapperTest.java:422) - sqlSession close successfully

在UPDATE條件中使用if

需求

假設我們需要實現這樣一個需求: 只更新有變化的字段,需要注意的是:更新的時候不能講原來有值但是沒有發生變化的值更新為空或者是null.

通過if標簽可以實現這種動態列更新


1.UserMapper接口中增加接口方法

/*** * * @Title: updateSysUserByIdSelective* * @Description: 根據主鍵更新SysUser* * @param sysUser* @return* * @return: int*/int updateSysUserByIdSelective(SysUser sysUser);

一般情況下,mybatis中選擇性更新的方法命名會以Selective作為后綴。


2.UserMapper.xml配置動態SQL

<update id="updateSysUserByIdSelective">update sys_user set<if test="userName != null and userName != ''">user_name = #{userName},</if><if test="userPassword != null and userPassword != ''">user_password = #{userPassword},</if><if test="userEmail != null and userEmail != ''">user_email = #{userEmail},</if><if test="userInfo != null and userInfo != ''">user_info = #{userInfo},</if><if test="headImg != null">head_img = #{headImg, jdbcType=BLOB},</if><if test="createTime != null">create_time = #{createTime, jdbcType=TIMESTAMP},</if>id = #{id}where id = #{id}</update>

這里要結合業務層的判斷邏輯,確保最終生成的SQL沒有語法錯誤。

注意事項
1. 每個if元素里面SQL語句后面的逗號

2. where關鍵字前面的id = #{id} 這個條件


舉個例子為什么要加 id = #{id}

  • 如果全部的查詢條件都是null 或者是空,最終的sql如下
udpate sys_user set id = #{id} where id = #{id} 如果沒有 `id = #{id}`,則SQL為 udpate sys_user set where id = #{id} 很明顯SQL語法是錯誤的。
  • 查詢條件只有一個不是null 也不是空 (比如userName)
    如果有 id = #{id}這個條件則SQL為
update sys_user set user_name = #{userName} , id = #{id} where id = #{id} 如果沒有 `id = #{id}`這個條件,最終SQL如下 update sys_user set user_name = #{userName} , where id = #{id} where關鍵字前面有個逗號,很明顯SQL語法是錯誤的

從上面兩種情況來看,id = #{id} 這個條件可以最大限度保證方法不出錯。 除了使用這種方式外,還可以結合業務層的邏輯判斷調整XML文件中的SQL來確保最終的SQL的正確性,也可以通過where 和 set標簽來解決這些問題


3.單元測試

@Testpublic void updateSysUserByIdSelectiveTest() {logger.info("updateSysUserByIdSelectiveTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 先根據ID查詢出對應的sysuserSysUser sysUser = userMapper.selectSysUserById((long) 1);// 當前數據庫用戶的userName期望為adminAssert.assertEquals("admin", sysUser.getUserName());// 修改用戶名sysUser.setUserName("dynamicUpdate");// 修改郵件sysUser.setUserEmail("dynamicUpdate@artisan.com");// 修改用戶 ,返回受影響的行數int result = userMapper.updateSysUserByIdSelective(sysUser);// 只插入一條數據 ,期望是1Assert.assertEquals(1, result);logger.info("受影響的行數:" + result);// 重新查詢(雖然未提交但是在一個會話中)sysUser = userMapper.selectSysUserById((long) 1);// 期望的用戶名為dynamicUpdateAssert.assertEquals("dynamicUpdate", sysUser.getUserName());// 期望的郵箱為dynamicUpdate@artisan.comAssert.assertEquals("dynamicUpdate@artisan.com", sysUser.getUserEmail());// 檢查其他字段有沒有被更新為null 或者 空值Assert.assertEquals("123456", sysUser.getUserPassword());Assert.assertEquals("管理員用戶", sysUser.getUserInfo());logger.info(sysUser);} catch (Exception e) {e.printStackTrace();} finally {// 為了保持測試數據的干凈,這里選擇回滾// 由于默認的sqlSessionFactory.openSession()是不自動提交的// 除非顯式的commit,否則不會提交到數據庫sqlSession.rollback();logger.info("為了保持測試數據的干凈,這里選擇回滾,不寫入mysql,請觀察日志,回滾完成");sqlSession.close();logger.info("sqlSession close successfully ");}}

日志

2018-04-21 21:34:32,025 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-21 21:34:32,031 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-21 21:34:32,037 INFO [main] (UserMapperTest.java:430) - updateSysUserByIdSelectiveTest 2018-04-21 21:34:32,673 DEBUG [main] (BaseJdbcLogger.java:145) - ==> 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-21 21:34:32,751 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1(Long) 2018-04-21 21:34:32,787 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time 2018-04-21 21:34:32,788 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-21 21:34:32,794 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1 2018-04-21 21:34:32,845 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: update sys_user set user_name = ?, user_password = ?, user_email = ?, user_info = ?, head_img = ?, create_time = ?, id = ? where id = ? 2018-04-21 21:34:32,851 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: dynamicUpdate(String), 123456(String), dynamicUpdate@artisan.com(String), 管理員用戶(String), java.io.ByteArrayInputStream@4a3e0e88(ByteArrayInputStream), 2018-04-13 21:12:47.0(Timestamp), 1(Long), 1(Long) 2018-04-21 21:34:32,855 DEBUG [main] (BaseJdbcLogger.java:145) - <== Updates: 1 2018-04-21 21:34:32,856 INFO [main] (UserMapperTest.java:451) - 受影響的行數:1 2018-04-21 21:34:32,856 DEBUG [main] (BaseJdbcLogger.java:145) - ==> 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-21 21:34:32,857 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1(Long) 2018-04-21 21:34:32,858 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time 2018-04-21 21:34:32,859 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, dynamicUpdate, 123456, dynamicUpdate@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-21 21:34:32,862 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1 2018-04-21 21:34:32,863 INFO [main] (UserMapperTest.java:463) - SysUser [id=1, userName=dynamicUpdate, userPassword=123456, userEmail=dynamicUpdate@artisan.com, userInfo=管理員用戶, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018] 2018-04-21 21:34:32,872 INFO [main] (UserMapperTest.java:472) - 為了保持測試數據的干凈,這里選擇回滾,不寫入mysql,請觀察日志,回滾完成 2018-04-21 21:34:32,874 INFO [main] (UserMapperTest.java:475) - sqlSession close successfully

在INSERT動態插入列中使用if

需求

在數據庫表中插入數據的時候,如果某一列的參數值不為空,就使用傳入的值,如果傳入的值為空,就使用數據庫中默認的值,而不是使用傳入的空值。

使用if就可以實現這種動態插入列的功能。

先給sys_user的user)email字段增加個默認值。

ALTER TABLE `sys_user` MODIFY COLUMN `user_email` VARCHAR (50) NULL DEFAULT 'default@artisan.com' COMMENT '郵箱' AFTER `user_password`

1.UserMapper接口中增加接口方法

/*** * * @Title: insertSysUserDyn* * @Description: insertSysUserDyn* * @param sysUser* @return* * @return: int*/int insertSysUserDyn(SysUser sysUser);

2.UserMapper.xml配置動態SQL

<insert id="insertSysUserDyn" useGeneratedKeys="true" keyProperty="id">insert into sys_user(user_name, user_password, <if test="userEmail != null"><if test="userEmail != ''">user_email, </if></if>user_info, head_img, create_time)values(#{userName}, #{userPassword}, <if test="userEmail != null"><if test="userEmail != ''">#{userEmail}, </if></if>#{userInfo}, #{headImg, jdbcType=BLOB}, #{createTime, jdbcType=TIMESTAMP})</insert>

在insert中使用要注意,若在列的部分增加if條件,則values的部分也要增加相同的if條件,必須保證上下可以相互對應,完全匹配。


3.單元測試

@Testpublic void insertSysUserDynTest() {logger.info("insertSysUserDynTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);logger.info("=========不設置email=========");// 不設置userEmail ,觀察是否能夠插入默認的emailSysUser sysUser = new SysUser();sysUser.setUserName("artisanTest");sysUser.setUserPassword("123456");sysUser.setUserInfo("測試用戶");// 模擬頭像sysUser.setHeadImg(new byte[] { 1, 2, 3 });sysUser.setCreateTime(new Date());// 新增用戶 ,返回受影響的行數int result = userMapper.insertSysUserDyn(sysUser);// 只插入一條數據 ,期望是1Assert.assertEquals(1, result);// 獲取這條新插入的sysUsersysUser = userMapper.selectSysUserById(sysUser.getId());// 沒有設置userEmail ,期望是數據庫的默認值Assert.assertEquals("default@artisan.com", sysUser.getUserEmail());logger.info(sysUser);logger.info("=========設置email=========");// 設置emailsysUser.setUserName("artisanTest");sysUser.setUserPassword("123456");sysUser.setUserEmail("artisan@artisan.com");sysUser.setUserInfo("測試用戶");// 模擬頭像sysUser.setHeadImg(new byte[] { 1, 2, 3 });sysUser.setCreateTime(new Date());result = userMapper.insertSysUserDyn(sysUser);// 獲取這條新插入的sysUsersysUser = userMapper.selectSysUserById(sysUser.getId());// 有設置userEmail ,期望是傳入的值Assert.assertEquals("artisan@artisan.com", sysUser.getUserEmail());logger.info(sysUser);} catch (Exception e) {e.printStackTrace();} finally {// 為了保持測試數據的干凈,這里選擇回滾// 由于默認的sqlSessionFactory.openSession()是不自動提交的// 除非顯式的commit,否則不會提交到數據庫sqlSession.rollback();logger.info("為了保持測試數據的干凈,這里選擇回滾,不寫入mysql,請觀察日志,回滾完成");sqlSession.close();logger.info("sqlSession close successfully ");}}

日志

2018-04-21 04:52:22,046 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-21 04:52:22,049 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-21 04:52:22,055 INFO [main] (UserMapperTest.java:477) - insertSysUserDynTest 2018-04-21 04:52:22,094 INFO [main] (UserMapperTest.java:484) - =========不設置email========= 2018-04-21 04:52:22,652 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: insert into sys_user( user_name, user_password, user_info, head_img, create_time) values( ?, ?, ?, ?, ?) 2018-04-21 04:52:22,735 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: artisanTest(String), 123456(String), 測試用戶(String), java.io.ByteArrayInputStream@5b20f3ff(ByteArrayInputStream), 2018-04-21 04:52:22.095(Timestamp) 2018-04-21 04:52:22,741 DEBUG [main] (BaseJdbcLogger.java:145) - <== Updates: 1 2018-04-21 04:52:22,744 DEBUG [main] (BaseJdbcLogger.java:145) - ==> 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-21 04:52:22,745 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1006(Long) 2018-04-21 04:52:22,778 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time 2018-04-21 04:52:22,779 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1006, artisanTest, 123456, default@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-21 04:52:22.0 2018-04-21 04:52:22,785 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1 2018-04-21 04:52:22,786 INFO [main] (UserMapperTest.java:503) - SysUser [id=1006, userName=artisanTest, userPassword=123456, userEmail=default@artisan.com, userInfo=測試用戶, headImg=[1, 2, 3], createTime=Sat Apr 21 04:52:22 BOT 2018] 2018-04-21 04:52:22,790 INFO [main] (UserMapperTest.java:505) - =========設置email========= 2018-04-21 04:52:22,792 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: insert into sys_user( user_name, user_password, user_email, user_info, head_img, create_time) values( ?, ?, ?, ?, ?, ?) 2018-04-21 04:52:22,795 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: artisanTest(String), 123456(String), artisan@artisan.com(String), 測試用戶(String), java.io.ByteArrayInputStream@5485687f(ByteArrayInputStream), 2018-04-21 04:52:22.79(Timestamp) 2018-04-21 04:52:22,798 DEBUG [main] (BaseJdbcLogger.java:145) - <== Updates: 1 2018-04-21 04:52:22,799 DEBUG [main] (BaseJdbcLogger.java:145) - ==> 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-21 04:52:22,800 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1007(Long) 2018-04-21 04:52:22,801 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time 2018-04-21 04:52:22,802 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1007, artisanTest, 123456, artisan@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-21 04:52:23.0 2018-04-21 04:52:22,803 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1 2018-04-21 04:52:22,803 INFO [main] (UserMapperTest.java:520) - SysUser [id=1007, userName=artisanTest, userPassword=123456, userEmail=artisan@artisan.com, userInfo=測試用戶, headImg=[1, 2, 3], createTime=Sat Apr 21 04:52:23 BOT 2018] 2018-04-21 04:52:22,809 INFO [main] (UserMapperTest.java:528) - 為了保持測試數據的干凈,這里選擇回滾,不寫入mysql,請觀察日志,回滾完成 2018-04-21 04:52:22,810 INFO [main] (UserMapperTest.java:531) - sqlSession close successfully

總結

以上是生活随笔為你收集整理的MyBatis-11MyBatis动态SQL之【if】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。