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>标签

复用时用的;

 

posted @   Eric-Shen  阅读(193)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示