Mybatis 使用if、choose、when、otherwise实现动态拼接sql语句

1,002 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

一、动态sql

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

1-1、使用if对参数进行判断,实现动态sql

在实际业务中,查询对象会根据不同的条件进行查询,比如查询员工,可能会根据id,name,createTime,endTime,deptId等进行查询,但是每次查询的参数有不确定因素,因此我们就需要判断当前使用那几个参数,然后再进行查询。

1-1-1、设置EmpMapper.xml查询

image.png

1-1-1-1、通过if判断数据动态拼接sql

在实际业务中,可以将已知的查询条件,先进行if判断,如果存着在动态拼接到sql中,如果不存在则不会拼接,这样就可以通过if实现动态sql了。

1-1-1-2、拼接sql需要和数据库字段保持一致

同时需要注意的是,拼接sql的时候需要使用数据库字段,如create_time/end_time。后面跟的参数为Emp对象的属性值。

1-1-1-3、 "<"等特殊符号的处理

在xml中如果使用了 “<” 则需要进行特殊处理,要么进行转义,要么用cdata括起来建议使用cdata,这样就不用记转义符是多少了。

1-1-1-4、条件的判断

1、、因为要实现动态拼接sql,设置了where条件,万一没有任何条件呢?因此需要在where后面加上 1=1 这样sql就不会报错了
2、同时也可以使用标签来进行处理,这样只要当有条件的时候才进行拼接where,这个标签会在条件后面自动加上and/or,同时也可以去掉条件前面的 and/or 如下: image.png 3、使用实现where节点的功能:
prefix在所有包含sql的前面加上设置的字符串,
prefixOverrides:去除整体字符串前面多余的字符,
sufix:在所有包含sql的后面加上设置的字符串,
suffixOverrides:去除后面多余的字符串。

image.png

以上三种情况,推荐使用

1-1-2、在EmpMapper.java 中添加接口

image.png

1-1-2、测试

1、只设置name为查询条件 image.png

2、同时设置name和createTime为查询条件

image.png

3、不设置查询条件

image.png

1-2、使用choose when otherwise动态拼接sql

通过choose when otherwise 可以实现多条件判断只去其中一个的逻辑

1-2-1、EmpMapper.xml配置

这里对deptName进行判断,满足某个条件则只走对应的条件

image.png

1-2-2、EmpMapper 接口方法

image.png

1-2-3、测试

设置deptName=研发部

image.png

设置deptName=市场部

image.png