ibatis复用SQL片段、引入片段 动态条件增加

在编写SqlMaps的时候,经常需要把一个sql拆分成多个片段。IBatis提供了一个简单有很实用的分割节点来进行SQL的分割。举个简单的例子,假设需要查询一些学生的信息。

    原来的写法是:

复制代码
<!--查询所有信息-->
<select id="SelectAllCraft" resultMap="StudentMap"> SELECT Id, Name, Age, Address, ClassID from Student </select> <!--根据学生编号查询信息--> <select id="SelectAllCraft" resultMap="StudentMap" parameterClass="Int">> SELECT Id, Name, Age, Address, ClassID from Student Where Id=#Value# </select>
复制代码

现在用sql标签可以这样写:

复制代码
<sql id ="selectAll"> select Id, Name, Age, Address, ClassID,ClassName from Student </sql> <!--查询所有信息--> <select id="SelectAllCraft" resultMap="StudentMap"> <include refid ="SelectALL"/> </select> <!--根据编号查询信息--> <select id="SelectAllCraft" resultMap="StudentMap" parameterClass="Int"> <include refid ="SelectALL"/> where id=#Value# </select>
复制代码

<include refid ="SelectALL"/> refid:就是指要调用sql标签的id。

sql标签就相当于C#里的定义一个字符串,里面存着一些值,可以被其他标签调用。这样一来就可以减少重复代码的书写。

IBatis动态拼接sql

实例:

复制代码
<!--动态加载sql语句-->
    <select id ="SelectByWhere" resultMap="StudentMap" resultClass="Hashtable"> <include refid ="SelectALL"/> <include refid="s"></include> <dynamic prepend="where"> <isParameterPresent> <isNotEmpty prepend="and" property="Name"> Name like '%$Name$%' </isNotEmpty> <isNotEmpty prepend="and" property="Address"> Address like '%$Address$%' </isNotEmpty> <isGreaterThan prepend="and" property="ClassID" compareValue="0"> <!--大于--> ClassID=#ClassID# </isGreaterThan> <isNotEqual prepend="and" property="Age" compareValue="0"> <!--不等于--> Age=#Age# </isNotEqual> </isParameterPresent> </dynamic> order by Id $Orderby$ </select>
复制代码

动态标签分类: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>

isPropertyAvailableisNotEmpty 的区别
这个两个属性非常有用 
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。

转载于:https://www.cnblogs.com/zouhong/p/9802889.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值