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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MyBatis-12MyBatis动态SQL之【choose when otherwise】

發(fā)布時(shí)間:2025/3/21 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis-12MyBatis动态SQL之【choose when otherwise】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  • 概述
  • 需求
  • 實(shí)現(xiàn)步驟
    • 1.UserMapper接口中添加接口方法
    • 2.UserMapper.xml中添加動(dòng)態(tài)SQL
    • 3.單元測試

概述

我們在if標(biāo)簽的博文MyBatis-11MyBatis動(dòng)態(tài)SQL之【if】
中介紹了if的在select、update、delete中的用法,可以實(shí)現(xiàn)基本的條件判斷, 但是卻無法實(shí)現(xiàn) if…else ,if ….else….的邏輯。

想要實(shí)現(xiàn) if…else ,if ….else….這樣的邏輯 就需要用到choose when otherwise標(biāo)簽了。

choose元素中包含了when和otherwise兩個(gè)標(biāo)簽 ,一個(gè)choose中至少有一個(gè)when,有0個(gè)或者1個(gè)otherwise


需求

前置條件: sys_user表中,除了id是主鍵外,我們認(rèn)為user_name也是唯一的,用戶名不可重復(fù)。

假設(shè)有個(gè)這樣的需求, 實(shí)現(xiàn)如下如下邏輯

  • 當(dāng)參數(shù)id有值時(shí)優(yōu)先使用id查詢
  • 當(dāng)沒有id時(shí)就去判斷用戶名是否有值,如果有值就根據(jù)用戶名全配
  • 如果用戶名也沒有值,就是sql查詢?yōu)榭?/li>

實(shí)現(xiàn)步驟

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

/*** * * @Title: selectSysUserByIdOrByUserName* * @Description: 根據(jù)用戶id或者用戶名查詢用戶* * @param sysUser* @return* * @return: SysUser*/SysUser selectSysUserByIdOrByUserName(SysUser sysUser);

2.UserMapper.xml中添加動(dòng)態(tài)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的時(shí)候邏輯要嚴(yán)密,避免由于某些值出現(xiàn)問題導(dǎo)致SQL出錯(cuò)。

在上述查詢中,如果沒有otherwise這個(gè)條件限制,當(dāng)id和username都為空時(shí),所有的用戶都會(huì)被查詢出來,但是我們在對引得接口方法中使用了SysUser作為返回值,所以當(dāng)實(shí)際查詢到多個(gè)結(jié)果時(shí)就會(huì)報(bào)錯(cuò), 添加otherwise后,由于where 后的條件不滿足,因此這種這種情況下查不到結(jié)果。


3.單元測試

@Testpublic void selectSysUserByIdOrByUserNameTest() {logger.info("selectSysUserByIdOrByUserNameTest");// 獲取SqlSessionSqlSession sqlSession = getSqlSession();try {// 獲取UserMapper接口UserMapper userMapper = sqlSession.getMapper(UserMapper.class);logger.info("======. 模擬傳入了正確的id 沒有傳username或者傳入了錯(cuò)誤的userName======");// 1. 模擬傳入了正確的id 沒有傳username或者傳入了錯(cuò)誤的userNameSysUser sysUser = new SysUser();sysUser.setId(1001L);sysUser.setUserName("noExistName");// 調(diào)用selectSysUserByIdOrByUserName,查詢單個(gè)用戶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);// 根據(jù)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或者傳入了錯(cuò)誤的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

注意觀察每個(gè)條件匹配的SQL語句


總結(jié)

以上是生活随笔為你收集整理的MyBatis-12MyBatis动态SQL之【choose when otherwise】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。