MyBatis—07—DQL: 动态SQL查询;
一、 <if>和<where>标签
《 if》标签 用于进行条件判断,test 属性用于指定判断条件,当满足判断条件,才可以拼接《if》标签里的sql。
为了满足select语句的拼接条件, 在 SQL 语句后强行添加where 1=1 的恒成立条件;
如图所示,mapper标签里, 加入《select》,《 select》标签里再用《if》标签做判断;
如果不想用拼接where 1=1 , 还可以加<where><where/>标签;
《where》标签 用于管理 where 子句.有如下功能:
- 如果没有条件满足, 不会 生成 where 关键字。
- 如果有条件满足, 会 添加 where 关键字
- 如果第一个条件中有 and,会 √自动去除and。
《where》标签会自动帮我们在SQL语句中添加或取消where子句(如果一个参数都没有那么where子句取消), 也会自动去除and;
2、<choose><when><otherwise>标签
when标签中的test标签相当于switch
when相当于 case
otherwise 相当于 default
3、<set>标签
<set>标签用于维护update中的set子句;
测试类中, 获取接口的对象, 调用接口的实现方法updUser();
4、<trim>标签
trim标签有4个属性: prefix、prefixOverrides……
<where>标签和<set>标签其实都是由trim标签演变而来;
当我们从前面添加了set, 从前面删除了user,从后面添加了hahaha,从后面删除了‘逗号,’ ,我们现在看一看测试类中调用本方法, 然后通过DEBUG的日志级别, 打印在console上的信息:
从这里我们也可以看到,当我们在mybatis中调用#{}而不是${}取参数时,mybatis底层对调用PreparedStatement,将参数先当成占位符处理。
所以使用#{}可以有效避免sql注入问题,而使用${}不可以。
5、<bind>标签
《bind》标签一般用于模糊查询,它是对传进来的参数数据进行再处理的;
由于是模糊查询,上图出现了一处错误,你能找到吗?
这个时候,#{username}取出的username就不是简简单单的username的值了,而是加了两个%的值;
6、<foreach>标签
《forech》标签是动态SQL查询中,迭代一个集合的必要操作,通常和IN条件一起使用;
举例:select * from employeesTable where id in(1,2,3,4),
把IN条件的元素(1,2,3,4)封装成一个list集合,然后把集合作为参数传入。
- foreach标签里,collection属性表示传过来的集合的名字,我们在接口中已经用注解让他叫‘list’了;
- open属性表示以什么符号开始;
- separator属性表示分隔符是什么;
- close属性表示集合元素全部取完时,以什么符号结尾;
- item属性表示集合中取到一个元素给他命名;
测试这个方法的结果:
7、<sql><include>标签
复用时用的;