Mybatis - <choose> 标签的用法
用法介绍
choose
标签作用是通过条件判断来拼接 SQL 语句,类似于 Java 中的 switch
语句,从上到下,当有匹配的条件时,跳出 choose
语句;如果所有条件都不成立则执行 otherwise
标签中的内容
语法格式为:
<choose><when test=条件1>...</when><when test=条件2>...</when><when test=条件3>...</when>...<otherwise>...</otherwise>
</choose>
使用细节
当有条件成立时,就不会继续执行了。
今天就碰到一个同事写的代码,功能是:年月日三个维度查询报表数据
后端使用四个字段来接收前端传的参数,分别是:
- 日查询为:startDate,endDate
- 月查询为:ymDate
- 年查询为:yDate
而这个同事在实现这个功能时,采用了 choose 标签来实现,他的 SQL 语句拼接为:
<choose><when test="query.startDate != null and query.startDate != '' and query.endDate != null and query.endDate != ''">and DATE_FORMAT(treat_start_time,'%Y-%m-%d') between #{query.startDate} and #{query.endDate}</when><when test="query.ymDate != null and query.ymDate != ''">and DATE_FORMAT(treat_start_time,'%Y-%m') = #{query.ymDate}</when><when test="query.yDate != null and query.yDate != ''">and DATE_FORMAT(treat_start_time,'%Y') = #{query.yDate}</when>
</choose>
然后就有测试的同学反馈说,为什么只有按 日
查询可以查到数据,按 年
和 月
都查不到数据,下面给出三种查询的传参:
- 年
{"startDate": "2022","endDate": "2022","ydate": "2022","ymDate": "2022-05",
}
- 月
{"startDate": "2022-05","endDate": "2022-05","ymDate": "2022-05",
}
- 日
{"startDate": "2022-05-30","endDate": "2022-05-30","ydate": null,"ymDate": null,
}
按照他的这种传参方式及 choose
判断方式分析,choose
只会执行第一个条件判断。解决办法为调整 when
条件的判断顺序为:
<choose><when test="query.yDate != null and query.yDate != ''">and DATE_FORMAT(treat_start_time,'%Y') = #{query.yDate}</when><when test="query.ymDate != null and query.ymDate != ''">and DATE_FORMAT(treat_start_time,'%Y-%m') = #{query.ymDate}</when><when test="query.startDate != null and query.startDate != '' and query.endDate != null and query.endDate != ''">and DATE_FORMAT(treat_start_time,'%Y-%m-%d') between #{query.startDate} and #{query.endDate}</when>
</choose>
总结
使用 choose
标签的时候,一定要注意最先需要判断的条件要放在前面,当匹配到某个条件时,就不会判断后面的语句了。
Mybatis - <choose> 标签的用法相关推荐
- mybatis choose标签的用法
先上代码: <choose> <when test="BEGINTIME != null and BEGINTIME != '' and ENDTIME != null a ...
- MySQL中choose标签的用法
MySQL中标签的用法 先给大家来个SQL语句: choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中 的 choose 很类似. SELECT ...
- mybatis choose标签的使用
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个.而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件.MyBatis 提供了 choose 元素.if标签是 ...
- MyBatis if标签的用法
<!--4.1.1 在WHERE条件中使用if需求:实现一个用户管理高级查询功能,根据输入的条件去检索用户信息.这个功能还需要支持以下三种情况:当只有输入用户名时,需要根据用户名进行模糊查询:当 ...
- mybatis choose when用法
mybatis choose when的用法: mapper.xml: <select id="query" resultType="map" param ...
- mybatis中<choose>标签的用法
choose 标签是按顺序判断其内部 when 标签中的 test 条件出否成立,如果有一个成立,则 choose 结束.当 choose 中所有 when 的条件都不满则时,则执行 otherwis ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...
- MyBatis choose、when和otherwise标签简介说明
转自: MyBatis choose.when和otherwise标签简介说明 MyBatis 中动态语句 choose-when-otherwise其功能: 同Java中的switch-case-d ...
- Mybatis的choose标签
1.choose标签介绍 choose标签作用条件判断来拼接指定的条件,它和if不太相同,choose似类于java中的switch语句用法,直要有条件成立,其它判断将得不到执行,如果所有条件都不成立 ...
- mybatis choose用法
choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束.当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的s ...
最新文章
- Python Qt GUI设计:QDrag拖拽数据传输类(基础篇—18)
- 【译】SQL Server误区30日谈-Day7-一个实例多个镜像和日志传送延迟
- C# main函数的返回值 - 译
- awk 分隔符 多个空格_如何在awk中指定多个分隔符
- python selenium webdriver入门基本操作
- JQuery放大镜效果
- vba 跳到下一个循环_遍历工作薄和工作表(For Each循环的利用)
- NodeJS 使用官方oracledb库连接数据库教程
- qt添加菜单纯代码_QtCreator插件开发(二)——QtCreator菜单和菜单项
- 关于socket组播和ssdp(一)[修改1.2]
- 获取 python import模块的路径
- 【论文投稿】SOTA论文也未必能被接收,谷歌科学家Eric Jang谈顶会审稿标准
- 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_16_注解_自定义注解_元注解...
- 离散数学——主析取范式与主合取范式原理探究
- css中border属性设置
- 天津等保测评机构项目测评收费价格标准参考
- java调用腾讯企业邮箱给谷歌(gmail)邮箱发送邮件丢失或进入垃圾邮箱
- 牧牛海派战法,区块链对经济社会的影响
- 不积小流,无以成江海;不积跬步,无以至千里
- python编写的动物识别专家系统_基于Python的动物识别专家系统