MyBatis—07—DQL: 动态SQL查询;


一、  <if>和<where>标签

《 if》标签 用于进行条件判断,test 属性用于指定判断条件,当满足判断条件,才可以拼接《if》标签里的sql。

为了满足select语句的拼接条件, 在 SQL 语句后强行添加where 1=1 的恒成立条件;

如图所示,mapper标签里, 加入《select》,《 select》标签里再用《if》标签做判断;

MyBatis—07—DQL: 动态SQL查询;

 如果不想用拼接where 1=1 , 还可以加<where><where/>标签;

   《where》标签 用于管理 where 子句.有如下功能:

  •  如果没有条件满足, 不会 生成 where 关键字。
  •  如果有条件满足, 会 添加 where 关键字
  •   如果第一个条件中有 and,会 √自动去除and。

《where》标签会自动帮我们在SQL语句中添加或取消where子句(如果一个参数都没有那么where子句取消), 也会自动去除and;

MyBatis—07—DQL: 动态SQL查询;

2、<choose><when><otherwise>标签

when标签中的test标签相当于switch

when相当于 case

otherwise 相当于 default

MyBatis—07—DQL: 动态SQL查询;

3、<set>标签

<set>标签用于维护update中的set子句;

MyBatis—07—DQL: 动态SQL查询;

 测试类中, 获取接口的对象, 调用接口的实现方法updUser();

MyBatis—07—DQL: 动态SQL查询;

4、<trim>标签

trim标签有4个属性: prefix、prefixOverrides……

<where>标签和<set>标签其实都是由trim标签演变而来;

MyBatis—07—DQL: 动态SQL查询;

 当我们从前面添加了set, 从前面删除了user,从后面添加了hahaha,从后面删除了‘逗号,’  ,我们现在看一看测试类中调用本方法, 然后通过DEBUG的日志级别, 打印在console上的信息:

MyBatis—07—DQL: 动态SQL查询;

从这里我们也可以看到,当我们在mybatis中调用#{}而不是${}取参数时,mybatis底层对调用PreparedStatement,将参数先当成占位符处理。

所以使用#{}可以有效避免sql注入问题,而使用${}不可以。

5、<bind>标签

《bind》标签一般用于模糊查询,它是对传进来的参数数据进行再处理的;

MyBatis—07—DQL: 动态SQL查询;

 由于是模糊查询,上图出现了一处错误,你能找到吗?

MyBatis—07—DQL: 动态SQL查询;

 这个时候,#{username}取出的username就不是简简单单的username的值了,而是加了两个%的值;

 

6、<foreach>标签

《forech》标签是动态SQL查询中,迭代一个集合的必要操作,通常和IN条件一起使用;

举例:select * from employeesTable where id in(1,2,3,4),

把IN条件的元素(1,2,3,4)封装成一个list集合,然后把集合作为参数传入。

 MyBatis—07—DQL: 动态SQL查询;

 MyBatis—07—DQL: 动态SQL查询;

  • foreach标签里,collection属性表示传过来的集合的名字,我们在接口中已经用注解让他叫‘list’了;
  • open属性表示以什么符号开始;
  • separator属性表示分隔符是什么;
  • close属性表示集合元素全部取完时,以什么符号结尾;
  • item属性表示集合中取到一个元素给他命名;

 测试这个方法的结果:

MyBatis—07—DQL: 动态SQL查询;

MyBatis—07—DQL: 动态SQL查询;

7、<sql><include>标签

复用时用的;

相关推荐