MyBatis动态SQL

在这里插入图片描述

文章目录

  • 前言
  • 一、\标签
  • 二、\标签
  • 三、\标签
  • 四、\标签
  • 五、\标签
  • 五、\标签 与 \标签


前言

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

一、标签

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

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

MyBatis动态SQL_第2张图片
MyBatis动态SQL_第3张图片
这里我们使用if标签就可以很好的应对传递不同类型的参数了。
只传递id:
MyBatis动态SQL_第4张图片
同时传递id和username:
MyBatis动态SQL_第5张图片
只传递username:

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

二、标签

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

三、标签

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

四、标签

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

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

五、标签

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

比如我们批量删除用户:
在这里插入图片描述
MyBatis动态SQL_第21张图片
MyBatis动态SQL_第22张图片
MyBatis动态SQL_第23张图片

五、标签 与 标签

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

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

你可能感兴趣的:(Spring框架,mybatis,sql,数据库)