MyBatis-12MyBatis动态SQL之【choose when otherwise】
生活随笔
收集整理的這篇文章主要介紹了
MyBatis-12MyBatis动态SQL之【choose when otherwise】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 概述
- 需求
- 實現步驟
- 1.UserMapper接口中添加接口方法
- 2.UserMapper.xml中添加動態SQL
- 3.單元測試
概述
我們在if標簽的博文MyBatis-11MyBatis動態SQL之【if】
中介紹了if的在select、update、delete中的用法,可以實現基本的條件判斷, 但是卻無法實現 if…else ,if ….else….的邏輯。
想要實現 if…else ,if ….else….這樣的邏輯 就需要用到choose when otherwise標簽了。
choose元素中包含了when和otherwise兩個標簽 ,一個choose中至少有一個when,有0個或者1個otherwise
需求
前置條件: sys_user表中,除了id是主鍵外,我們認為user_name也是唯一的,用戶名不可重復。
假設有個這樣的需求, 實現如下如下邏輯
- 當參數id有值時優先使用id查詢
- 當沒有id時就去判斷用戶名是否有值,如果有值就根據用戶名全配
- 如果用戶名也沒有值,就是sql查詢為空
實現步驟
1.UserMapper接口中添加接口方法
/*** * * @Title: selectSysUserByIdOrByUserName* * @Description: 根據用戶id或者用戶名查詢用戶* * @param sysUser* @return* * @return: SysUser*/SysUser selectSysUserByIdOrByUserName(SysUser sysUser);2.UserMapper.xml中添加動態SQL
<select id="selectSysUserByIdOrByUserName" 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<choose><when test="id != null ">and id = #{id}</when><when test="userName!= null ">and user_name = #{userName}</when><otherwise>and 1 = 2</otherwise></choose></select>使用choose when otherwise的時候邏輯要嚴密,避免由于某些值出現問題導致SQL出錯。
在上述查詢中,如果沒有otherwise這個條件限制,當id和username都為空時,所有的用戶都會被查詢出來,但是我們在對引得接口方法中使用了SysUser作為返回值,所以當實際查詢到多個結果時就會報錯, 添加otherwise后,由于where 后的條件不滿足,因此這種這種情況下查不到結果。
3.單元測試
@Testpublic void selectSysUserByIdOrByUserNameTest() {logger.info("selectSysUserByIdOrByUserNameTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);logger.info("======. 模擬傳入了正確的id 沒有傳username或者傳入了錯誤的userName======");// 1. 模擬傳入了正確的id 沒有傳username或者傳入了錯誤的userNameSysUser sysUser = new SysUser();sysUser.setId(1001L);sysUser.setUserName("noExistName");// 調用selectSysUserByIdOrByUserName,查詢單個用戶SysUser user = userMapper.selectSysUserByIdOrByUserName(sysUser);// 期望不為空Assert.assertNotNull(user);// userName 期望值為artisanAssert.assertEquals("artisan", user.getUserName());logger.info(user);logger.info("======2. 模擬不傳id,但是傳入了正確的 userName======");// 2. 模擬不傳id,但是傳入了正確的 userNamesysUser = new SysUser();sysUser.setId(null);sysUser.setUserName("admin");user = userMapper.selectSysUserByIdOrByUserName(sysUser);// 期望不為空Assert.assertNotNull(user);// 根據id查詢 sysuser,然后獲取userName 期望值為artisanAssert.assertEquals("admin", user.getUserName());logger.info(user);logger.info("======3.什么都不傳======");// 2. 模擬不傳id,但是傳入了正確的 userNamesysUser = new SysUser();sysUser.setId(null);sysUser.setUserName(null);user = userMapper.selectSysUserByIdOrByUserName(sysUser);// 期望為空Assert.assertNull(user);logger.info(user);} catch (Exception e) {e.printStackTrace();} finally {sqlSession.close();logger.info("sqlSession close successfully ");}}日志
2018-04-21 19:46:51,942 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully 2018-04-21 19:46:51,947 INFO [main] (BaseMapperTest.java:29) - reader close successfully 2018-04-21 19:46:51,951 INFO [main] (UserMapperTest.java:541) - selectSysUserByIdOrByUserNameTest 2018-04-21 19:46:51,979 INFO [main] (UserMapperTest.java:548) - ======. 模擬傳入了正確的id 沒有傳username或者傳入了錯誤的userName====== 2018-04-21 19:46:52,569 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 id = ? 2018-04-21 19:46:52,647 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1001(Long) 2018-04-21 19:46:52,685 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime 2018-04-21 19:46:52,686 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1001, artisan, 123456, test@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-21 19:46:52,694 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1 2018-04-21 19:46:52,695 INFO [main] (UserMapperTest.java:559) - 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 19:46:52,699 INFO [main] (UserMapperTest.java:561) - ======2. 模擬不傳id,但是傳入了正確的 userName====== 2018-04-21 19:46:52,700 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 = ? 2018-04-21 19:46:52,701 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: admin(String) 2018-04-21 19:46:52,702 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime 2018-04-21 19:46:52,702 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0 2018-04-21 19:46:52,703 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1 2018-04-21 19:46:52,706 INFO [main] (UserMapperTest.java:571) - 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 19:46:52,706 INFO [main] (UserMapperTest.java:573) - ======3.什么都不傳====== 2018-04-21 19:46:52,707 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 1 = 2 2018-04-21 19:46:52,707 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 2018-04-21 19:46:52,709 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 0 2018-04-21 19:46:52,709 INFO [main] (UserMapperTest.java:581) - 2018-04-21 19:46:52,712 INFO [main] (UserMapperTest.java:587) - sqlSession close successfully注意觀察每個條件匹配的SQL語句
總結
以上是生活随笔為你收集整理的MyBatis-12MyBatis动态SQL之【choose when otherwise】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis-11MyBatis动态S
- 下一篇: MyBatis-13MyBatis动态S