Mybatis动态SQL
一、问题分析
- 假如用户不输入任何条件来查询,是可以的
- 假如用户只输入姓名、性别或入职日期条件来查询,都是可以的
-
但是我们之前写的sql语句,是必须同时满足三个条件才可以查询到数据,否则是不行的
-
这样肯定是不行的,因此需要使用 动态SQL
二、介绍
-
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为 动态SQL。
三、<if>
1. 介绍
<if>
:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。<where>
:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。
2. 优化
(1) <if>
标签
- 用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
(2) 测试
① 姓名条件
-
①. 查询名字中有 “张” 的员工
② 性别条件
-
②. 查询性别为 “女” 的员工
(3)<where>
标签
- where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。
(4) 测试(<where>
标签作用)
① 性别条件
<where>
作用①:会自动去除子句的开头的 AND 或 OR
② 空条件
<where>
作用②:where 元素只会在子元素有内容的情况下才插入where子句
3. 案例
- 完善更新员工功能,修改为动态更新员工数据信息
(1) 需求
- 动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新。
(2) 解决方案
- 动态SQL
(3) 分析
-
之前使用Java注解的形式:
-
原因:
(4) 实现
①. XML
-
自动生成,并补充sql语句
②. 测试
- 正常:
- 异常:
(5) <set>
标签
- 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
- 测试:
4. 小结
1.<if>
-
用于判断条件是否成立,如果条件为true,则拼接SQL。
-
形式:
<if test="name != null">…</if>
2.<where>
- where 元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND 或OR
3.<set>
- 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
四、<foreach>
1. 介绍
- 格式:
<foreach collection="" item="" separator="" open="" close="">...</foreach>
- 属性介绍:
- collection:集合名称
- item:集合遍历出来的元素/项
- separator:每一次遍历使用的分隔符
- open:遍历开始前拼接的片段
- close:遍历结束后拼接的片段
-
业务场景:
2. 批量删除
(1) SQL分析
- 例如:批量删除如下员工
-- 批量删除员工
delete from emp where id in (19,21,23);
(2) Mybatis实现
-
Mapper接口方法:
-
XML映射文件SQL:
-
测试:
-
批量删除如下员工:
-
五、<sql>&<include>
1. 介绍
(1) <sql>
<sql>
:定义可重用的 SQL 片段。
(2) <include>
<include>
:通过属性 refid,指定包含的sql片段。
(3) 问题分析
-
问题分析:
-
解决问题:
- 比如我们编写Java代码时,如果有些代码块功能经常被复用,那么我们就会将其抽取出来,封装到一个方法里
- 这样其他地方需要用到此功能时,可通过调用该方法来使用该功能。
2. 实现
- XML映射文件:
- 测试:
六、总结
1.XML映射文件
- 映射配置文件名与Mapper接口名一致,且放在相同的包下(同包同名)。
- 映射配置文件的namespace属性与Mapper接口的全类名一致。
- XML映射文件中sql语句的id与Mapper 接口中的方法名一致。
2.动态SQL
<if>
<where>
<set>
<foreach>
<sql>
<include>