12.动态SQL
什么是动态SQL:动态SQL就是指根据不同的条件生成不同的SQL语句
利用动态 SQL,可以彻底摆脱这种痛苦。
如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
搭建环境
创建一个基础工程
1.导包
2.编写配置文件
3.编写实体类
4.编写实体类对应的Mapper接口和Mapper.xml文件
我们这里存在数据库字段名和实体类属性名不一致的情况:
所以我们要使用到xml里的配置
核心配置文件中配置:
添加数据:
接口:
xml:
测试:
IF
接口:
xml:
测试:
查询全部:
按照title查询:
根据title和author查询;
根据author查询:
trim(where, set)
where标签:
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。(可以用于代替where 1=1)
改写上一个代码(if):
我们发现它自动去除了and
如果我们什么都不传:
我们来看看输出的结果:
它可以自动把where去掉
choose(when,otherwise)
接口:
xml:
不加title和author的查询(按views查询):
现在同时传title和views
我们发现我们此时title条件满足,就不再判断views了
三个参数都传递时:
同理,只要满足一个条件,它就结束了。
第一个条件不满足就去判断第二个条件
set:
接口:
更改信息操作:
原表:
xml:
测试:
只改作者名字:
trim:很少用
所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码
if
where,set,choose,when
SQL片段
有的时候,我们可能会将一些功能的部分抽取出来,方便复用!
注意事项:
最好基于单表来定义SQL片段
不要存在where标签
Foreach
接口:
xml:
测试:
没有加入id条件时:
能查到全部信息,where自动省略
动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了
建议:
先在Mysql中写出完整的SQL,再对应的去修改成为我们的动态SQL实现通用即可!