动态sql

news/2024/5/19 1:19:50


本文参考mybatis看这一篇就够了,简单全面一发入魂

动态SQL
可以根据具体的参数条件,来对SQL语句进行动态拼接。

比如在以前的开发中,由于不确定查询参数是否存在,许多人会使用类似于where 1 = 1 来作为前缀,然后后面用AND 拼接要查询的参数,这样,就算要查询的参数为空,也能够正确执行查询,如果不加1 = 1,则如果查询参数为空,SQL语句就会变成SELECT * FROM student where ,SQL不合法。

mybatis里的动态标签主要有

if

<!-- 示例 -->
<select id="find" resultType="student" parameterType="student">SELECT * FROM student WHERE age >= 18<if test="name != null and name != ''">AND name like '%${name}%'</if>
</select>

当满足test条件时,才会将<if>标签内的SQL语句拼接上去

where 

<where>标签在MyBatis中用于动态生成SQL语句中的WHERE子句。它可以根据条件表达式的结果自动地添加或省略WHERE关键字,并且能够处理多个条件之间的逻辑关系(AND、OR)。

<where>标签通常与<if><choose><when><otherwise>等条件判断标签一起使用,以根据不同的条件构建不同的SQL WHERE子句。

如果WHERE之后是以AND或OR开头,会自动将其删掉

下面是一些使用<where>标签的例子:

  1. 使用<where>标签包含一个条件:
<select id="findActiveUsers" resultType="User">SELECT * FROM users<where>status = #{status}</where>
</select>

如果status参数不为null,<where>标签会生成WHERE status = #{status};如果status为null,则不会生成任何内容,避免了额外的WHERE关键字。

        2.使用<where>标签包含多个条件:

<select id="findUsersByNameAndAge" resultType="User">SELECT * FROM users<where><if test="name != null">name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>

在这个例子中,如果nameage参数都不为null,<where>标签会生成WHERE name = #{name} AND age = #{age}。如果只有name不为null,它会生成WHERE name = #{name}。如果两个参数都为null,则不会生成任何内容。

        3.使用<where>标签处理复杂的条件逻辑:

<select id="findUsersByComplexCondition" resultType="User">SELECT * FROM users<where><if test="name != null">name = #{name}</if><if test="age != null"><choose><when test="age > 18">AND age > 18</when><otherwise>AND age = #{age}</otherwise></choose></if><if test="status != null">AND status = #{status}</if></where>
</select>

在这个例子中,<where>标签结合了<if><choose><when><otherwise>标签来构建复杂的条件逻辑。

<where>标签的优点是它能够自动处理WHERE关键字的存在与否,以及条件之间的逻辑关系,使得生成的SQL语句更加准确和简洁。

<choose>, <when>, <otherwise>

<choose>, <when>, <otherwise>标签是MyBatis中用于条件判断的标签,类似于Java中的switch-case语句。它们通常与<if><else>标签一起使用,用于根据不同的条件生成不同的SQL片段。

下面是<choose>, <when>, <otherwise>标签的使用示例:

<select id="findUsersByStatus" resultType="User">SELECT * FROM users<where><choose><when test="status == 'active'">AND status = 'active'</when><when test="status == 'inactive'">AND status = 'inactive'</when><otherwise>AND status IS NULL</otherwise></choose></where>
</select>

在这个例子中,我们根据用户的状态(status)来查询用户数据。如果状态为"active",则生成AND status = 'active';如果状态为"inactive",则生成AND status = 'inactive';否则,生成AND status IS NULL

<choose>标签用于包含多个条件判断,它内部可以包含一个或多个<when>标签和一个可选的<otherwise>标签。每个<when>标签都对应一个条件表达式,当该条件满足时,会执行对应的SQL片段。如果所有<when>标签的条件都不满足,且存在<otherwise>标签,则会执行<otherwise>标签内的SQL片段。

通过使用<choose>, <when>, <otherwise>标签,我们可以更灵活地构建动态SQL语句,根据不同的条件生成不同的SQL片段,提高代码的可读性和可维护性。

trim

 <where>标签可以用<trim>标签代替  

可以通过<trim>标签更加灵活地对SQL进行定制

<trim prefix="WHERE" prefixOverrides="AND | OR">...
</trim>

set

在至少有一个子元素返回了SQL语句时,才会向SQL语句中添加SET,并且如果SET之后是以,开头的话,会自动将其删掉

<set>标签相当于如下的<trim>标签

<trim prefix="SET" prefixOverrides=",">...
</trim>

实际上在mybatis源码,也能看到trim与set,where标签的父子关系

foreach 

用来做迭代拼接的,通常会与SQL语句中的IN查询条件结合使用,注意,到parameterType为List(链表)或者Array(数组),后面在引用时,参数名必须为list或者array。如在foreach标签中,collection属性则为需要迭代的集合,由于入参是个List,所以参数名必须为list

<select id="batchFind" resultType="student" parameterType="list">SELECT * FROM student WHERE id in<foreach collection="list" item="item" open="(" separator="," close=")">#{item}</foreach>
</select>

sql

可将重复的SQL片段提取出来,然后在需要的地方,使用<include>标签进行引用

<select id="findUser" parameterType="user" resultType="user">SELECT * FROM user<include refid="whereClause"/>
</select><sql id="whereClause"><where><if test="user != null">AND username like '%${user.name}%'</if></where>
</sql>


http://www.mrgr.cn/p/74328807

相关文章

54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试

工程代码https://download.csdn.net/download/txwtech/89258409?spm1001.2014.3001.5501 54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试 import socket from ohos.net.socket; import process from ohos.process; import wifiManager from ohos.wifiMana…

2. 基础配置

1. 配置文件格式 1.1 配置文件自动提示功能消失解决方案 ​​ 1.2 SpringBoot配置文件加载顺序(了解) application.properties > application.yml > application.yaml 1.3 注意事项 SpringBoot核心配置文件名为application SpringBoot内置属性过多,且所有属性集中…

Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速

一、前言 最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速。这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放。实时视频流是不可能倍速的,因为没有时长,有时长的才可以按照播放进度来。…

Excel求解器使用教程

添加规则求解加载项创建excel文件,点击文件点击选项选择加载项->规则求解加载项->转到选择规则求解加载项->确定求解器所在位置---数据->规划求解在excel文档中填写相关的计算公式,用来求解点击规则求解,填写对应的目标,可变单元和约束,选择求解方法来求解通过…

虚拟机创建教程

虚拟机创建 创建虚拟机的时候,选择自定义,自己来创建虚拟机在虚拟机中,选择创建16.2.X版本的虚拟机,兼容性比较好在创建虚拟机的操作系统时,选择稍后安装操作系统,实测中如果选择其他的在安装过程中会跳过系统安装的部分阶段选择对应的系统和版本选择名称和安装位置,个人…

union 和union all 使用区别

union 和union all 把 查询user表前5条数据查询user表数据从第7条数据开始,查询两条 通过union来把两个sql中的数据合并到一张表中,只查询出一条数据,会把重复的数据去掉 通过union all查询 出现出了两条数据,不会去重

安全再升级,亚信安慧AntDB数据库与亚信安全二次牵手完成兼容性互认证

日前&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;的产品与亚信科技&#xff08;成都&#xff09;有限公司&#xff08;简称&#xff1a;亚信安全&#xff09;再次携手&#xff0c;完成亚信安慧AntDB数据库与亚信安全IPoE接入认证系统…

YOLO系列改进,自研模块助力涨点

目录 一、原理 二、代码 三、添加到YOLOv5中 一、原理 论文地址:

TypeError: Cannot read properties of undefined (reading trim)

运行时提示:TypeError: Cannot read properties of undefined (reading trim) 问题排查: 1、确认trim()属性是否存在,这个是js 去除字符串左右空格,属性是存在的 2、确认this.form.proxy_url是否存在 3、确认确认this.form.proxy_url的值是否为undefined和null 通过排查和打…

vue2 项目执行npm run serve 启动项目卡在24%一直不动

vue模板中添加了信息,应这样写:<div>接口管理</div>

使用Neo4j和Langchain创建知识图谱

使用Neo4j和Langchain创建知识图谱 知识图谱是组织和整合信息的强大工具。通过使用实体作为节点和关系作为边缘&#xff0c;它们提供了一种系统的知识表示方法。这种有条理的表示有利于简化查询、分析和推理&#xff0c;使知识图在搜索引擎、推荐系统、自然语言处理和人工智能…

富文本编辑器 iOS

https://gitee.com/klkxxy/WGEditor-mobile#wgeditor-mobile 采用iOS系统浏览器做的一款富文本编辑器工具。 原理就是使用WKWebView加载一个本地的一个html文件&#xff0c;从而达到编辑器功能的效果&#xff01; 由于浏览器的一些特性等&#xff0c;富文本编辑器手机端很难做…

深入理解网络原理3----TCP核心特性介绍(上)【面试高频考点】

文章目录 前言TCP协议段格式一、确认应答【保证可靠性传输的机制】二、超时重传【保证可靠性传输的机制】三、连接管理机制【保证可靠性传输的机制】3.1建立连接&#xff08;TCP三次握手&#xff09;---经典面试题3.2断开连接&#xff08;四次挥手&#xff09;3.3TCP状态转换 四…

FSNotes for Mac v6.7.1中文激活:轻量级笔记管理工具

FSNotes for Mac&#xff0c;一款专为Mac用户打造的轻量级笔记管理工具&#xff0c;让您的笔记管理变得简单而高效。 FSNotes for Mac v6.7.1中文激活版下载 它采用Markdown文件格式&#xff0c;让您轻松创建和编辑富文本笔记&#xff0c;无需担心格式问题。同时&#xff0c;FS…

关于google search console工具提交sitemap.xml无法抓取的问题解决办法

其实这个问题很好解决。 第一种情况&#xff1a;利用工具为我们的网站自动生成静态的sitemap.xml文件。这种可以检查下是否完整&#xff0c;然后上传到根目录下去&#xff0c;再去google search console提交我们的网站地图。 第二种情况&#xff1a;同样利用工具自动生成动态s…

博客园数据备份相关

OpenAPI文档 文档地址,使用前必须先申请权限,应用介绍要详细点。这种方式支持随笔和文章,不支持笔记。 管理后台备份只能在工作日18:00之后、8点之前或周六、周日进行操作,每天只允许备份一次。这种方式仅支持随笔。 使用爬虫 使用接口来模拟网页版的操作,使用 Jsoup 库来…

arduino uno+LCD12864(ST7735S)+蓝牙模块实现贪吃蛇

1.前言: 1.1本实验实现的贪吃蛇能穿越边界,结束游戏的唯一条件是贪吃蛇到达指定长度 1.2本实验所用LCD可能不是LCD12864,LCD12864所用库为u8glib,笔者在词库中并没有找到型号为ST77355的初始化函数,而是在ucglib中找到,其方法为 Ucglib_ST7735_18x128x160_SWSPI ucg(/*sc…

three.js入门指南

WebGL和Three.js的概念 什么是WebGL WebGL是基于OpenGL ES 2.0的Web标准&#xff0c;可以通过HTML5 Canvas元素作为DOM接口访问。 也就是WebGL是作为OpenGL的网页端入口。它作为一个底层标准&#xff0c;然后我们可以通过JavaScript代码&#xff0c;在网页上实现三维图形的渲…

3031087 -“无数据”:物料不显示在 MRP 应用中

症状 使用其中一个 MRP 应用&#xff08;监控物料覆盖范围、管理物料覆盖范围、监控外部需求等&#xff09;时无法找到物料。 用户在搜索过滤器时会收到错误消息“无数据”。 “本 KBA 中的图像/数据来自 SAP 内部系统、示例数据或演示系统。任何与真实数据相似的都是完全巧…