Mybatis - <choose> 标签的用法

2023-10-26

用法介绍

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 标签的时候,一定要注意最先需要判断的条件要放在前面,当匹配到某个条件时,就不会判断后面的语句了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis - <choose> 标签的用法 的相关文章

  • 复习使用git(二)

    删除远程分支 git push origin delete 分支名 撤销修改 撤销工作区的修改 已修改 但尚未添加 add 使用 git restore 文件名 撤销工作区的修改 Note git checkout 文件名 checkout

随机推荐

  • 基于STM32F407的SDCard读写操作及USB挂载(HAL库)

    基于STM32F407的SDCard读写操作及USB挂载 HAL库 本来在上一篇SD卡读写也都OK了 后来想着挂载SD卡做U盘 就去查了下资料 结果基本全是HAL库的 原来没用过HAL库 于是本着好奇的心态去下了 说实话 确实看起来简单多了
  • 【Spring Boot】——集成JSON工具

    前言 json是现在非常流程的数据交换格式 所以对于被开发人员来说如何更好了解java对象和json格式之间的转换是至关重要的 接下来我们来好好说一说 一 什么是JSON 摘自百度百科 JSON JavaScript Object Nota
  • android 涨潮动画加载_潮汐apk客户端-潮汐android最新版APP下载v2.0.1.1 免费版-腾牛安卓网...

    潮汐一个非常有特色的静心平台 它可以让你在工作困乏时聆听几分钟就可以更加高效的工作 让你的工作效率达到更好的专注 它可以让你的心情更加温和 让你的每一天不再那么浮躁和枯燥无味 让你的心情越来越舒畅 喜欢的朋友快来腾牛网下载吧 软件特色 保持
  • Linux实验报告【全集】

    若对你有帮助 记得点赞 关注我哦 实验目录 Linux常用命令 linux下的shell编程 Linux下的c编程 Linux下的API编程 每个实验的图片都比较多 一开始实验基本都是书上的例题 后面会变难 做实验时往往会想 为什么每届都做
  • 开发环境配置:服务器训练模型工具tmux基础使用

    开发环境配置 服务器训练模型工具tmux基础使用 1 tumx可以做什么 2 Ubuntu安装tmux 3 常用命令 3 1 新建会话并进入 3 2 退出会话 3 3 查看存在的会话 3 4 重新进入会话 3 5 销毁会话 1 tumx可以
  • C#检测是否在单元测试环境

    true则为单元测试环境下 false不是 bool unitTest System Environment StackTrace IndexOf NUnit Framework StringComparison CurrentCultur
  • ShareSDK集成第三方登录和分享的步骤

    转自 http my oschina net u 1024921 blog 170588 之前用过这个几次了 而每次都没有记录一下具体的步骤 这次就写一下吧 1 去ShareSDK下载官方的SDK 2 现在他们的服务特别人性化 解压SDK之
  • SiamFC:利用全卷积孪生网络进行视频跟踪

    目录 论文下载地址 代码下载地址 论文作者 模型讲解 模型结构 模型输入 损失函数 训练过程 结果分析 传送门 论文下载地址 SiamFC论文地址 SiamFC论文百度网盘下载地址 提取码 7309 SiamFC论文翻译 水印 百度网盘下载
  • Python-logging详解(彩色日志扩展,多进程安全等)

    目录 简介 日志级别 记录器 处理器 格式器 多线程与多进程安全 代码 导入及全局变量 函数 实验及结果 参考 简介 日志是工程中不可缺少的一部分 国家等保2 0也规定 至少保留日志180天 对于程序员来说 日志也方便进行记录及排错 log
  • 算法10——c++实现中缀表达式计算

    题目描述 读入一个只包含 x 的非负整数计算表达式 计算该表达式的值 输入格式 测试输入包含若干测试用例 每个测试用例占一行 每行不超过200个字符 整数和运算符之间用一个空格分隔 没有非法表达式 当一行中只有0时输入结束 相应的结果不用输
  • c 语言 成员变量模板,C++类模板与模板类深入详解

    1 在c 的Template中很多地方都用到了typename与class这两个关键字 而且有时候二者可以替换 那么是不是这两个关键字完全一样呢 事实上class用于定义类 在模板引入c 后 最初定义模板的方法为 template 这里cl
  • 通过字节码深入了解创建对象的过程

    package shixun test public class Test2643 public static void main String args Person person new Person class Tag int i p
  • redis数据库与python交互

    redis交互 import redis redis数据库链接 import pickle class Conn db def init self 创建对本机数据库的连接对象 self conn redis StrictRedis host
  • matlab图加上箭头和标注实例

    在图上加箭头的函数有annotation quiver annotation 函数 1 annotation annotation type 以指定的对象类型 使用默认属性值建立注释对象 2 annotation line x y 建立从
  • python副业介绍以及渠道推荐,接单注意事项

    这是本文的目录 前言 Python为什么会大受欢迎 python副业有哪些 1 兼职处理数据 2 兼职查询资料 3 兼职P图 4 爬虫类 5 平台接单 Python赚外快的一些其它方式 1 自媒体也是个风口 2 知识付费分享 3 招聘网站
  • Mybatis学习笔记:使用注解开发(CRUD)

    学习内容 使用注解开发 CRUD 文章目录 学习内容 使用注解开发 CRUD 1 怎么使用注解 2 用注解实现CRUD 增删改查 3 关于 Param 注解 4 和 区别 1 怎么使用注解 1 1 注解在接口上实现 1 2 需要再核心配置文
  • Qt帮助文档的寻找以及环境变量的配置

    文章目录 前言 一 Qt帮助文档的位置 二 Qt环境变量的配置 总结 前言 今天来介绍Qt非常重要的环境变量的配置以及帮助文档的寻找 一 Qt帮助文档的位置 在平时我们需要查看帮助文档时 我们可以把鼠标放在需要查询的字段上按F1或者直接去帮
  • 音频功放PA

    D类 D类功放接收模拟音频信号 用内部三角波发生器产生的三角波和它进行比较 其结果就是一个脉宽调制信号 PWM 然后将PWM信号放大并还原成模拟音频信号 因此 D类功放是用脉冲宽度对模拟音频幅度进行模拟的 其信息的传递过程是模拟的 非量化的
  • 游戏开发unity xlua框架知识系列:xLua基础使用

    插眼 总结 无 参考 https blog csdn net THIOUSTHIOUS article details 86658863 https blog csdn net THIOUSTHIOUS article details 86
  • Mybatis - <choose> 标签的用法

    用法介绍 choose 标签作用是通过条件判断来拼接 SQL 语句 类似于 Java 中的 switch 语句 从上到下 当有匹配的条件时 跳出 choose 语句 如果所有条件都不成立则执行 otherwise 标签中的内容 语法格式为