经常遇到很多按照很多查询条件进行查询的情况,比如京东根据不同的条件筛选商品。其中经常出现很多条件不取值的情况,在后台应该如何完成最终的SQL语句呢?
如果采用JDBC进行处理,需要根据条件是否取值进行SQL语句的拼接,一般情况下是使用StringBuilder类及其append方法实现,还是有些繁琐的。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
MyBatis在简化操作方法提出了动态SQL功能,将使用Java代码拼接SQL语句,改变为在XML映射文件中截止标签拼接SQL语句。相比而言,大大减少了代码量,更灵活、高度可配置、利于后期维护。
MyBatis中动态SQL是编写在mapper.xml中的,其语法和JSTL类似,但是却是基于强大的OGNL表达式实现的。
MyBatis也可以在注解中配置SQL,但是由于注解功能受限,尤其是对于复杂的SQL语句,可读性很差,所以较少使用。
1,动态SQL之if
动态Sql之if可以对条件进行判断,where后面的1=1是一个小技巧,没有实际意义,相当于:
select * from emp where 1=1 and test empno = #{empno} and ...
方便拼接if标签成立下的where条件,防止出错。
插入:模糊查询
2,动态SQL之where和when
在if标签中,我们使用1=1的技巧,后面可以使用where标签进行替换,它会干掉if标签的第一个and,如上图。
Choose标签:
3,动态SQL之SET标签
4,动态SQL之trim标签
动态SQL之bind标签
一般用于处理模糊查询的模板
接口