在编写SqlMaps的时候,经常需要把一个sql拆分成多个片段。IBatis提供了一个简单有很实用的分割节点来进行SQL的分割。举个简单的例子,假设需要查询一些学生的信息。
原来的写法是:
现在用sql标签可以这样写:
<include refid ="SelectALL"/> refid:就是指要调用sql标签的id。
sql标签就相当于C#里的定义一个字符串,里面存着一些值,可以被其他标签调用。这样一来就可以减少重复代码的书写。
IBatis动态拼接sql
实例:
动态标签分类:1<dynamic>,2 二元标签,3 一元标签,4 <iterate>
这四种标签以及他们的子标签具有共同的属性prepend,open,close。
<dynamic>可以去除第一个prepend="and"中的字符(这里为and)从而方便一些操作。
一元条件元素的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
<isPropertyAvailable> 检查是否存在该属性(存在parameter bean的属性)。
<isNotPropertyAvailable> 检查是否不存在该属性(不存在parameter bean的属性)。
<isNull> 检查属性是否为null。
<isNotNull> 检查属性是否不为null。
<isEmpty> 检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)。
<isNotEmpty> 检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)。
例子:
<isNotEmpty prepend=”AND” property=”firstName” >
FIRST_NAME=#firstName#
</isNotEmpty>
二元条件元素的属性: 二元是两个对象进行比较
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
compareProperty - 另一个用于和前者比较的属性(必选或选择compareValue)
compareValue - 用于比较的值(必选或选择compareProperty)
<isEqual> 比较属性值和静态值或另一个属性值是否相等。
<isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual> 比较属性值是否大于等于静态值或另一个属性值。
<isLessThan> 比较属性值是否小于静态值或另一个属性值。
<isLessEqual> 比较属性值是否小于等于静态值或另一个属性值。
例子:
<isLessEqual prepend=”AND” property=”age” compareValue=”18”>
ADOLESCENT = ‘TRUE’
</isLessEqual>
isPropertyAvailable和isNotEmpty 的区别
这个两个属性非常有用
isPropertyAvailable:入参有这个属性
isNotEmpty:入参的这个属性不为空
入参一般是一个封装了数据的DTO
如果希望一个属性无论为何值都符合条件则使用isPropertyAvailable
如果希望一个属性只是不为空的时候才符合条件就用isNotEmpty
<iterate>:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。
Iterate的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)
例子:
<iterate prepend=”AND” property=”userNameList” open=”(” close=”)” conjunction=”OR”> username=#userNameList[]# </iterate> = and(username=name1 or username=name2...)
注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单地将List输出成String。