前面学习使用mybatis时会发现,我们之前自己在程序中写sql访问数据库时,有时候情况会很复杂,需要程序自己根据实际的情况,进行各种判断,进行拼接字符串,最终生成响应的sql语句,列如:
string sql;
sql += "select * from t_cat";
if(name != null && name != "")
{
sql += "name ="+name;
}
if(age!= null && age!= 0)
{
sql += "age ="+age;
}
但是我们的mybatis的sql是写在xml中的,如何实现上面这样动态的生成需要的sql语句呢,mybatis如此强大当然已经提供了动态SQL这个功能啦,那就是在sql映射文件中使用标签来完成动态sql选择
if 判断,test为判断条件, 成立就拼接,不成就跳过。(很简单吧!)需要注意的是,有些符号需要使用转义字符,例如(&&,“”等)。
我们发现,在拼接sql字符串的时候,往往每个条件的头或者尾部符号的拼接让我们很麻烦,列如下面中的and,我让我们在传入的条件参数中没有传递id的值,那么最终的sql语句就会变成 select * from catdao and cname = tom and cgander = 0 and cage = 1;这样访问数据库无疑会出现问题。<where>标签就帮我们解决了这个问题,他可以替代sql语句中的 WHERE,并且可以自动的帮我们删除每个条件中,前面多余的and,注意也仅仅是前面多余的and,如果把and写在后边就不好使啦(现在感觉这个标签不是很好用哈,这里推荐使用<trim>标签,比<where>更强的)
<trim>标签用于字符串的处理,prefix属性可以在整个字符串的前边添加某个字符串;suffix属性可以在整体字符串的末尾添某个字符串;prefixOverrides属性则可以判断某个字符串在某一句的前部是不是多余,如果多余就删除;suffixOverrides属性与前边相似,判断的事每句的结尾处,是不是有某一个多余的字符串,如果有则删除;
使用了trim标签后,这样在动态sql条件中q开头和末尾多出来的 and就都可以自动去除掉了,是不是很方便。
<foreach>标签用于对集合的遍历,当我们调用方法的参数是一个collection,或者为map时。我们就可以使用<foreach>标签来遍历并取得参数,从而进行sql语句的拼接,通常是在进行构建IN条件语句的时候。列如:
collection属性:指定要遍历集合的key(这里有个问题需要注意,例如如果集合为list,该属性的值只能填list。这里推荐使用@param(“ids”)起别名的方式来定义集合的key,这样我们就可以自己想写什么就写什么);
open属性:使用什么开头;
close属性:使用什么结尾;
item属性:给每次遍历集合中的元素起个名字,之后可以使用这个名字获取该值;
separator属性:使用什么作为分割;
index属性:索引,
如果遍历的是一个list:
index:指定的变量保存了当前的索引;
item:指定的变量保存了当前遍历元素的值;
如果遍历的是一个map:
index:指定的变量就保存了当前遍历元素的key;
item:指定的变量就是保存当前遍历元素的value;
<choose>标签的作用是分之选择。用法比较简单,只有其中有一个条件满足,其他条件就不会执行。他与<if>比较类似,但是与if的区别就是相当于if与if...else if...else 的区别 ,直接上例子简单易懂:
<set>标签用于数据库表的更新,通常我们采用<if>与<set>结合的方式来进行数据库表动态更新操作。
<include>标签用于引用可重用的sql语句,通常与<sql>标签配合使用
另外,补充了解:
类型 | 伪属性 | 伪属性对应的 Java 方法 |
List、Set、Map | size、isEmpty | List/Set/Map.size(),List/Set/Map.isEmpty() |
List、Set | iterator | List.iterator()、Set.iterator() |
Map | keys、values | Map.keySet()、Map.values() |
Iterator | next、hasNext | Iterator.next()、Iterator.hasNext() |
_databaseId 变量:代表当前环境
_parameter变量:代表传入进来的参数
1)、若传入了单个的参数:_parameter就代表这个参数
2)、若传入了多个的参数:_parameter则代表多个参数集合起来的map
这里可以看到,使用不同的sqlSession都取得catDao类,以同样的参数访问相同的方法,只访问了一次数据库。
jar包与xml的下载地址:https://download.csdn.net/download/qq_25106373/10886233。