MyBatis动态SQL

在这里插入图片描述


前言

动态sql是Mybatis的强大功能特性之一,能够完成不同条件下的sql拼接
在这里插入图片描述
以上是官方文档对动态SQL的介绍,简单来说动态SQL就是随着用户的输入或外部的条件的变化而变化的SQL语句,我们称为动态SQL

一、<if>标签

<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL

比如我们要查询一个用户信息,我们可能会根据id查,也可能根据username查,也可能根据id和username一起查,这时我们的查询条件就不固定了,我们该怎么实现呢?就需要借助if标签了。

在这里插入图片描述
在这里插入图片描述
这里我们使用if标签就可以很好的应对传递不同类型的参数了。
只传递id:
在这里插入图片描述
同时传递id和username:
在这里插入图片描述
只传递username:

在这里插入图片描述
我们可以发现,当我们只传递usernma就会报错(SQL语法错误),那id和username都不传呢?
在这里插入图片描述
同样会报错,那是不是就是说if标签不能使用呢?不是,因为if标签需要搭配其他标签一起来使用(where和trim),我们Mybatis中多个参数都是非必传的参数的解决方案有多种方式:
方案1. 1 == 1
在这里插入图片描述
我们在where后面加上 1 = 1后,不管参数怎么传递都不会出现where多余或者and多余的SQL语法错误
方案2:trim标签
方案3:where标签

二、<where>标签

where标签一共有两个作用:
1.当后面条件全部不成立时,会自动去掉where关键字,相当于查询全表信息
2.可以帮助我们去掉条件前面的and或or
这样可以完美的解决if标签使用时候的两种情况
在这里插入图片描述
我们再去执行,只传username:
在这里插入图片描述
我们可以发现where标签帮助我们去掉了条件前面的and,正确的执行了查询操作。
那id和username都不传呢?
在这里插入图片描述
我们可以发现where标签当if条件都不成立时帮我们去掉了where关键字
大家需要注意的是where标签会帮助我们去掉最前面的and关键字,但不会帮我们去掉最后面的and关键字

三、<trim>标签

如果我们在进行SQL操作时,如果所有的字段都是非必填时,就需要考虑使用trim标签了,结合if标签,对各个字段采取动态生成的方式。
trim标签有以下属性:
prefix:表示整个语句块,以prefix值为前缀
suffix:表示整个语句块,以suffix作为后缀
prefixOverrides:表示整个语句块要去掉的前缀
suffixOverrides:表示整个语句块要去掉的后缀
在这里插入图片描述
大家需要注意这里的prefix是否生成取决于后面的if条件是否判断成功
在这里插入图片描述
当后面条件全部判断失败时,是不会生成prefix前缀的
在这里插入图片描述
suffixOverrides会帮助我们去掉后面指定的and后缀。
大家可以根据我们的具体需求,来进行trim的四个参数的设置

四、<set>标签

set标签主要有两个作用:
1.帮助我们去掉多余的后缀,
2.如果if条件全部判断失败,去掉set
set标签主要是针对更新操作,使用set标签可以进行不定参数的更新操作。
比如说我们进行更新操作,可能更新id的username,也可能更新id的password,也可能username和password都更新
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以发现当我们只传入username后面多了个,报了SQL语法异常
在这里插入图片描述
当我们username和password都不传时,多了set也报了SQL语法异常

我们来使用set标签:
在这里插入图片描述
在这里插入图片描述
我们使用set标签后,只传username属性时,可以发现帮助我们去掉了后缀多余的,
在这里插入图片描述
我们使用set标签时,username和password都不传时,帮我们去掉了set关键字,但仍然报语法错误,这种是业务上的错误,我们不必关注,一般在Controller层就会进行处理

五、<foreach>标签

当我们想要进行批量操作时,就可以使用foreach标签,foreach标签有以下属性:
collection:绑定方法参数中的集合参数,如List,Set,Map或数组
item:遍历时的每一个元素
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串

比如我们批量删除用户:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、<sql>标签 与 <include>标签

在 MyBatis 中,我们可以使用 元素定义可重用的 SQL 片段。这些 SQL 片段可以被其他 SQL 语句引用和包含,从而减少了代码的重复编写。同时,MyBatis 还支持使用 元素将外部 SQL 片段包含到当前的 SQL 语句中。
sql和include是一对标签,配套使用的,有一个经典的使用场景,比如我们在查询的时候并不想使用select *,因为效率太低,但是数据库的字段有太多,我们每次进行写SQL的时候都特别麻烦,这时我们就可以使用sql和include标签

在这里插入图片描述
在这里插入图片描述
总之,MyBatis 中的 和 元素非常实用,能够有效地减少代码的重复编写,提高 SQL 查询语句的可维护性和可读性。需要注意的是,为了避免 SQL 注入漏洞等安全问题,我们应该尽量使用参数化查询和预编译语句,而不是直接拼接字符串。

  • 29
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬夜磕代码丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值