李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
06.MyBatis动态SQL介绍
Leefs
2022-12-08 PM
1072℃
0条
[TOC] ### 前言 Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决 拼接SQL语句字符串时的痛点问题。 动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。 ### 一、动态SQL的元素 MyBatis 的动态 SQL 包括以下几种元素,如下表所示 | 元素 | 作用 | 备注 | | ----------------------- | ---------------------------- | ----------------------- | | if | 判断语句 | 单条件分支判断 | | choose(when、otherwise) | 相当于Java中的swith case语句 | 多条件分支判断 | | trim、where | 辅助元素 | 用于处理一些SQL拼接问题 | | foreach | 循环语句 | 在in语句等列举条件常用 | | bind | 辅助元素 | 拼接参数 | ### 二、if标签 - `if`:根据标签中`test`属性所对应的表达式决定标签中的内容是否需要拼接到`SQL`中 - `if`标签可通过`test`属性的表达式进行判断,若表达式的结果为`true`,则标签中的内容会执行;反之标签中的内容不会执行。 - 在`if`标签中可以直接使用传入对象中的属性 > 注意:在`where`之后加入一个恒成立条件`1=1` > > 在`where`的后面加入恒成立条件`1=1`的原因是: > > + 防止后面所有的条件都不成功,`where`多余后报错; > + 同时还防止第一个条件不成立,在`where`的后面直接跟着`and`造成报错。 **语法** ```xml
满足条件的语句
``` **示例** + **DynamicSQLMapper.xml 文件** ```xml
select * from t_emp where 1 = 1
and emp_name = #{empName}
and age = #{age}
and sex = #{sex}
and email = #{email}
``` ### 三、where标签 **`where`和`if`一般结合使用**: - 若`where`标签中的`if`条件都不满足,则`where`标签没有任何功能,即不会添加`where`关键字 - 若`where`标签中的`if`条件满足,则`where`标签自动添加`where`关键字,并将条件最前面多余的`and`或`or`去掉 **注意:`where`标签不能去掉最后多余的`and`或`or`,所以不能把`and`或`or`写到后面** **语法** ```xml
满足条件的语句
``` **示例** + **DynamicSQLMapper.xml 文件** ```xml
select * from t_emp
emp_name = #{empName}
and age = #{age}
or sex = #{sex}
and email = #{email}
``` ### 四、trim标签 + **`trim`**:用于去掉或添加标签中的内容 - 若标签中有内容时: - `prefix|suffix`:将`trim`标签中内容前面或后面添加指定内容 - `prefixOverrides|suffixOverrides`:将`trim`标签中内容前面或后面去掉指定内容 - 若标签中没有内容时: - `trim`标签也没有任何效果 **语法** ```xml
``` **示例** + **DynamicSQLMapper.xml 文件** ```xml
select * from t_emp
emp_name = #{empName} and
age = #{age} or
sex = #{sex} and
email = #{email}
``` ### 五、`choose when otherwise`标签 `choose`是父级标签,将`when`和`otherwise`嵌套在内部 `when`:只有一个时,相当于`if`,当`when`有多个时,相当于`if ...else if...else if`,并且`when`至少要有一个 `otherwise`相当于`else`,并且最多只能有一个,也可以没有,就是所有条件都不满足时,则执行`otherwise`中的内容 相当于`if ... else ... if ... else ...`语句,只要有一个条件满足,则就是跳转该语句,如果不满足则执行最后的`else`中的内容 > 注意:`when`至少要有一个,otherwise最多只能有一个 **语法** ```xml
满足条件的语句 when>
满足其他条件的语句
``` **示例** + **DynamicSQLMapper.xml 文件** ```xml
select * from t_emp
emp_name = #{empName}
age = #{age}
sex = #{sex}
email = #{email}
did = 1
``` ### 六、foreach标签 + 对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代。 + Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。 **语法** ```xml
#{item}
``` **属性说明** + **item**:表示集合中每一个元素进行迭代时的别名。 + **index**:指定一个名字,表示在迭代过程中每次迭代到的位置。 + **open**:表示该语句以什么开始(既然是 in 条件语句,所以必然以`(`开始)。 + **separator**:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以`,`作为分隔符)。 + **close**:表示该语句以什么结束(既然是 in 条件语句,所以必然以`)`结尾)。 使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的。 **主要有以下三种情况**: + 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。 + 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。 + 如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。 Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。 **示例** **批量删除方式一** + **DynamicSQLMapper.xml 文件** ```xml
delete from t_emp where eid in
#{eid}
``` **批量删除方式二** + **DynamicSQLMapper.xml 文件** ```xml
delete from t_emp where
eid = #{eid}
``` **批量添加** + **DynamicSQLMapper.xml 文件** ```xml
insert into t_emp values
(null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)
``` 注意:由于在`List`中存放的是每个`Emp`对象,所以需要获取`Emp`中的属性需要使用`emp`对象名`.`的形式访问 ### 七、`sql`标签 `sql`片段,可以记录一段公共的`sql`片段,在使用的地方通过`include`标签进行引入 **语法** ```xml
需要替代的sql片段
``` **调用** ```xml
``` 通过调用可以直接当被定义的sql语句使用 **示例** **1、先声明`sql`片段** ```sql
eid,ename,age,sex,did
``` **2、引用`sql`片段** ```xml select
from t_emp ``` *附参考文章链接* *《尚硅谷MyBatis零基础教程》*
标签:
MyBatis
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2670.html
上一篇
05.MyBatis自定义映射resultMap
下一篇
01.MyBatis-Plus简介
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Hbase
线程池
Nacos
ClickHouse
持有对象
并发线程
MySQL
机器学习
容器深入研究
DataWarehouse
Java工具类
队列
字符串
Flume
Redis
Golang
CentOS
数据结构
Hadoop
高并发
工具
Spark RDD
Yarn
序列化和反序列化
MyBatis
pytorch
人工智能
前端
递归
Typora
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭