SELECT count(web_sys_module.module_Id) FROM web_sys_module WHERE 1=1
  <isNotEmpty prepend="AND" property="module_Id">
   <![CDATA[ web_sys_module.module_Id = #module_Id# ]]>
  </isNotEmpty>
我想问下这个<isNotEmpty prepend="AND" property="module_Id">和
<![CDATA[ web_sys_module.module_Id = #module_Id# ]]>都是什么意思.才看ibatis,求懂的帮忙解惑,谢谢.

解决方案 »

  1.   

    在每个节点中间都有一个sql语句,用于执行对应的操作。书写方式及注意点:
    <![CDATA[……]]> :通过这个节点可以避免sql中与xml规范相冲突的字符对xml映射文件的合法性造成影响。
    #属性名# :在运行期会由传入的参数使用对应的get方法获取值并填充。
    【动态Mapped Statement】
    在复杂查询过程中,我们经常需要根据用户的选择决定查询条件,这里发生变化的并不只是SQL中的参数,包括select语句中所包括的字段和限制条件,都可能发生变化。考虑到这个问题,ibatis引入了动态映射机制,即在statement定义中,根据不同的查询参数,设定对应的SQL语句。
    下面是一个使用动态映射的例子:
    <select id="Ibatis.queryByQuery" parameterClass="User" resultMap="user">
    select
    <include refid="user.all" />
    from t_user
    <dynamic prepend="where">
    <isNotEmpty prepend="and" property="name">
    (name like '%$name$%')
    </isNotEmpty>
    <isNotNull prepend="and" property="sex">
    (sex = #sex,handler=GenderTypeHandler#)
    </isNotNull>
    <isGreaterThan prepend="and" property="age" compareValue=”0”>
    (age = #age#)
    </isGreaterThan>
    </dynamic>
    </select>
    上面的例子中,<dynamic>元素划分出SQL语句的动态部分。动态部分可以包含任意多的条件标签元素,条件标签决定是否在语句中包含其中的SQL代码。所有的条件标签元素将根据传给动态查询Statement的参数对象的情况来工作。<dynamic>元素和条件元素都有“prepend”属性,它是动态SQL代码的一部分,在必要情况下,可以被父元素的“prepend”属性覆盖。上面的例子中,prepend属性“where”将覆盖第一个为“真”的条件元素。这对于确保生成正确的SQL语句是有必要的。例如,在第一个为“真”的条件元素中,“AND”是不需要的,事实上,加上它肯定会出错。以下小节讨论不同的条件元素,包括二元条件元素,一元条件元素和其他动态元素。
     二元条件元素
    二元条件元素将一个属性值和一个静态值或另一个属性值比较,如果条件为“真”,元素体的内容将被包括在查询SQL语句中。
    节点名 含义
    <isEqual> 比较属性值和静态值或另一个属性值是否相等。
    <isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
    <isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
    <isGreaterEqual> 大于等于
    <isLessThan> 小于
    <isLessEqual> 小于等于
    其中每个节点有以下属性:
    prepend :可被覆盖的sql语句组成部分,添加在语句的前面(可选)
    property : 被比较的属性(必选)
    compareProperty :另一个用于和前者比较的属性(必选或选择compareValue)
    compareValue :用于比较的值(必选或选择compareProperty)
     一元条件元素
    一元条件元素检查属性的状态是否符合特定的条件。
    节点名 含义
    <isPropertyAvailable> 检查是否存在该属性。
    <isNotPropertyAvailable> 检查是否不存在该属性。
    <isNull> 检查属性是否为null。
    <isNotNull> 检查属性是否不为null。
    <isEmpty> 检查Collection,属性的String等值是否为null或空。
    <isNotEmpty> 检查Collection,属性的String等值是否不为null或不空。
    一元条件元素的属性:
    prepend :可被覆盖的sql语句组成部分,添加在语句的前面(可选)
    property : 被比较的属性(必选)
     其他元素
    Parameter Present : 检查参数对象是否存在
    它有一个属性为prepend。
    节点名 含义
    <isParameterPresent > 检查是否存在参数对象(不为null)。
    <isNotParameterPresent > 检查是否不存在参数对象(参数对象为null)。
    Iterate : 遍历整个集合,并为List集合中的元素重复元素体的内容。
    它有以下5个属性:
    prepend :可被覆盖的sql语句组成部分,添加在语句的前面(可选)
    property :类型为java.util.List的用于遍历的元素(必选)
    open :整个遍历内容体开始的字符串,用于定义括号(可选)
    close : 整个遍历内容体结束的字符串,用于定义括号(可选)
    conjunction :每次遍历内容之间的字符串,用于定义AND或OR(可选)
    节点名 含义
    <iterate > 遍历类型为java.util.List的元素。
    <iterate prepend="AND" property="userNameList"
    open="(" close=")" conjunction="OR">
    username=#userNameList[]#
    </iterate>
    注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单的将List输出成String。
       以上内容对sqlMap所涉及到的配置相关的内容做了一个总结。
      

  2.   

    isNotEmpty:Checks to see if the value of a Collection, String or String.valueOf()property is not null and not empty (“” or size() < 1).动态查询用的,可以按module_Id和module_Name的组合来查询
      

  3.   


    <!--就是个sql拼接的问题 -->
     <isNotEmpty prepend="AND" property="module_Id">
      <![CDATA[ web_sys_module.module_Id = #module_Id# ]]>
      </isNotEmpty>
    //用代码写一写<isNotEmpty>...</isNotEmpty>大概就是这样
    String sqlString = "select * ...."; //假设这是你前面的sql
    //<isNotEmpty> 就像下面这样
    if (!module_Id.equals(null) && module_Id.length > 1) {
        sqlString += "web_sys_module.module_Id = #module_Id#";
    }至于这个<![CDATA[....]]>
    是屏蔽特殊字符用的,如果sql中出现了特殊字符, 可以用这个把sql框起来,特殊字符就失效了.
      

  4.   

    ibatis的动态映射,isNotEmpty是判断语句,相当于if  ,prepend用来拼接sql语句,<![CDATA[....]]>用来转义,例如<,>,&这些特殊字符