• 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>
    View Code

    动态标签分类: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。 
    [color=darkred][/color] 

  • 相关阅读:
    Python 向列表中添加元素
    [python] 查找列表中重复的元素
    Excel文件的读写
    Oracle EBS AP 取消付款
    Oracle EBS AP取消核销
    Oracle EBS AP 创建贷项通知单并核销到相应发票
    Oracle EBS AR 其他API
    Oracle EBS AR 冲销收款
    Oracle EBS 银行账户API
    Oracle EBS AR 客户API
  • 原文地址:https://www.cnblogs.com/gyyc/p/3328181.html
Copyright © 2020-2023  润新知