Mybatis系列---动态SQL
Posted xss512
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis系列---动态SQL相关的知识,希望对你有一定的参考价值。
问题: 什么是动态SQL? 动态SQL有什么作用?
传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误。Mybatis的动态SQL功能正是为了解决这种问题,
其通过 if, choose, when, otherwise, trim, where, set, foreach,可组合成非常灵活的SQL语句,从而提高开发人员的效率。
下述可知道这四个操作节点中的子节点都是差不多是一样的,insert和update中多了一个selectKey节点(下面会详细的说到),下面介绍一下这些节点的用法:
1. if: 判断
在mybatis中也能用 if :(if子节点没有属性)
if节点的test属性是取的参数对象中的成员变量名
1、编写数据访问接口(要创建实体类的哟,这里就不截图了)
2、映射文件中编写:
3、编写测试类:
上面例子: 如果传入的managerAccount 不为空, 那么SQL才拼接managerAccount = #{managerAccount}
下面的代码是要么提供managerAccount 要么提供managerName查询
<if test="managerAccount != null">
managerAccount=#{managerAccount}
</if>
<if test="managerName != null">
managerName=#{managerName}
</if>
那如果我要两个条件都提供才能查询呢?这个时候就可以用and符号来进行拼接:
<if test="managerAccount ! =null">
managerAccount=#{managerAccount}
</if>
<if test="managerName ! =null">
and managerName=#{managerName}
</if>
如果managerAccount不等于空的时候才会执行managerName,如果managerAccount等于空就不会执行managerName,就不能实现需要两个条件才能查询同样单个给定条件也不能查询了。
这个时候就有问题,那传过去的参数为空怎么办?
这时候,mybatis的 where 节点的作用就来了
2、where(where子节点没有属性)
这个<where/>节点就告诉我们说看我们的连接运算符,当然你也可以用or‘连接,如果查询条件managerAccount是第一个那就会把managerName前面的and符号去掉(去掉之后语句为:select managerAccount,password,managerName from tb_Manager where managerAccount=字段值 and managerName=字段值,因为where语句后面是不能跟and或者or的),如果查询managerName为第一个那么就会把managerAccount前面的and符号就会去掉。那就可以实现我给两个条件也可以查询,给一个条件也可以查询。如果一个条件都不给,那sql语句中条件关键字where就没有,就会直接执行“ select managerAccount,password,managerName from tb_Manager ” 这条语句。从表面上来看,就是多了个where节点而已, 不过实质上, mybatis是对它做了处理,当它遇到AND或者OR这些,它知道怎么处理。
<where/>子节点的作用
1、在使用where节点时,如果没有给条件,SQL语句中的条件关键字where就没有。
2、如果该节点中有条件,则在SQL语句后加上where关键字,以组装条件sql语句
3、在编写条件时,如果有多个的话,多个之间的逻辑运算符一定写在条件的前面,这个节点在执行时,会去掉第一个条件前面的逻辑运算符。
3、 foreach:
java中有for, 可通过for循环, 同样, mybatis中有foreach, 可通过它实现循环,循环的对象当然主要是java容器和数组。
大家应该I都知道查询主键的sql语句是:select * from 表名 where 字段名 in (字段名的值);
foreach节点有6个属性:
collection:表示集合
close:表示结束符
index:表示次序
item:表示集合中的一项
open:表示开始符
separator:表示各项的分隔符
1、在映射文件中编写:我写的语句是通过账号查询,你也可以换成其它字段名验证。
上述 collection=“list” 里面的list,是需要到你写的实体中去添加list这个实体,如下图:
tem="it" 表示你这个集合中的某一项,就是命名。
open="(" :表示你开始的符号为“(”。
separator="," 表示各项的分隔符为“,”。
close=")":表示你结束的符号为“)”
就是拼接sql语句,执行拼接出来的语句是select * from tb_manager where managerAccount in (字段名/主键值,字段名/主键值,.........);
将一个 List 实例或者数组作为参数对象传给 MyBatis,当这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。
2、编写测试类:
4、bind节点
bind节点属性
name属性:表示绑定之后要使用的名称。相当于创建了一个变量,变量名由name属性给出。
value属性:表示绑定时的值
bind节点可以看成是定义一个变量,变量的名称由name属性指定,变量的值由value属性指定
该节点没有子节点
应用场景:使用用户名进行模糊查询
模糊查询,在SQL中的通配符:
%:表示匹配任意多个字符
?:表示匹配0个或1个字符
查询用户名中包涵“o”字母的用户: %o%
select * from tb_user where managerAccount like ‘%o%’;
1、映射文件中编写:
未完。。。。。。
以上是关于Mybatis系列---动态SQL的主要内容,如果未能解决你的问题,请参考以下文章