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