ibatis 标签

<iterate>标签以一个集合或数组类型的特性作为其property属性值,ibatis通过遍历这个集合(数组)来从一组中重复产生某种sql小片段。这些小片段以conjunction属性值作为分隔符连接起来,从而形成一个有意义的sql语句片段,open属性值将作为所呈现的值列表的前缀,close属性值将作为所呈现的值列表的后缀,最终动态形成一个完整合法的sql。


<iterate>标签属性

property(必须的)包含列表的参数的特性。

prepend(可选的)该值用于作为前缀附加到标签的结果内容体前。只有在以下3种情况下,prepend值才不会被加为前缀:(a)当标签的结果内容体为空时;(2)如果该标签第一个产生内容体,并且它被嵌套在一个removeFirstPrepend属性被设置为true的父标签时;(c)如果此标签是跟在prepend属性取值非空的<dynamic>标签后的第一个生成内容体的标签。

open(可选的)该值用于作为前缀加到标签的结果内容体前。如果结果内容体前为空,open值将不会被附加到其前面。open值将在prepend属性值被添加前缀之前先被添加前缀。例如,假设prepend=“or” 而open=“(”,则最终得到的组合前缀将会是“or(“。

close(可选的)该值用于作为后缀附加到标签的结果内容体后,如果结果内容体为空,则close值将不起作用。

conjunction(可选的)该值用于连接ibatis遍历集合(数组)时重复产生那些sql小片段

removeFirstPrepend(可选的)该值用于决定第一个产生内容的嵌套子标签是否移除其prepend值。


如何使用<iterate>标签来为sql语句构建更加复杂的where字句

示例:

。。。

<select id="getProducts" parameterClass="Product"

               resultClass="Product">

   select * from products

<dynamic prepend="where productType in">

      <iterate property="productTypes"

                     opne="(" close=")"

                     conjunction=",">

      productType=#productType[]#

     </iterate>

</dynamic>

</select>

。。。


上例中,我们创建了一个select语句,然后遍历一组产品类型(product type) 以为其构造了一个更加复杂的过滤器。





对ibatis标签<iterate>的理解,在看ibatis文档时,就看见过这个标签,并且还 
对其不是很了解,一直没有到现在,在工作中用到了这个标签时, 
才去了解了一下这个标签的具体含义。 
先把文档中对该标签的介绍贴出来一起分享。 
��� Iterate:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。 
Iterate的属性: 
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。 
我本人对上面<iterate>标签中内容的理解如下: 
在生成该条sql语句时,<iterate>标签中的内容是循环生成的,就拿上面的例子来说,生成的sql是 
(username=xxx1 or username=xxx2 or username=xxx 3) 
而不是(username=xxx1 or xxx2 or xxx3) 
再举个例子,如下: 
id in 
<iterate  prepend="" property="ids"  open="("  close=")"  conjunction="," > 
               #ids[]# 
  </iterate> 。。。。。。。(1) 
  其生成的sql语句是:id in (xx1,xx2,xx3,.....),括号中的(包括括号)是<iterate>标签生成的。 
  <iterate>标签虽然是遍历整个集合的,但他也不象我们在java中用到的for一样,一次一次的 
  循环生成标签中的内容,而是一次性利用list或数组生成整个可运行的sql语句。 
  就好比(1)它生成的sql不可能象这样:id in (xx1) 
  id in (xx2)  ,id in (xx3),..... 

你可能感兴趣的:(ibatis,iterate标签)