ibatis iterator list 参数 …

来源:互联网 发布:淘宝店转让 编辑:程序博客网 时间:2024/05/17 09:48
原文地址:iterator list 参数 查询">ibatis iterator list 参数 查询作者:沉默生活

list参数查询,据说ibatis官方是有例子,我没有看到,基本上就是通过iterator标签可以循环,拼出sql。例如批量删除:

 

<select id="queryBatch" resultMap="resultMap" parameterClass="list">        select * from tableName where        ID in        <iterate open="(" close=")" conjunction=",">            #[]#        </iterate>    </select>
 

注意parameterClass 是java.utils.list而iterate里面的属性直接写成#[]#,而这个时候查询方法的参数则是:list<Long>

 

如果还不明白为什么这么写,看下面的写法。

 

<select id="getProducts" parameterClass="Product"        resultClass="Product">  SELECT * FROM Products  <dynamic prepend="WHERE productType IN ">    <iterate property="productTypes"             open="(" close=")"             conjunction=",">      productType=#productType#    </iterate>  </dynamic></select>

 

这里的parameterClass是自己定义的一个对象,而对象里面是有一个list的productTypes的属性。而#productType#则是productType对象的一个属性(小声告诉你,这是我猜的,并且没有求证过~~~)

 

可以参考文章:

 

然而上面一种情况可能不会是我们常用的一种方式,我们可能参数直接就是list,在iterate中就无需写property属性了,就像第一个例子中,但是由于我们list中不是单一的long或者string,而是一个封装的对象,需要取里面具体的某个属性,

我在第一种方式的基础上,试验了很多种写法,如:#list[].id# , #[].id# , #id# , #id[]#。很不幸都失败了。

于是我还是采用了和加property的方式完成。而这个时候注意parameterClass=“map”,其实是将list放到了map中传进来的,并且map的key就是personList。

 

<delete id="deletePerson" parameterClass="map">     delete from 表名 where      sex=#sex#              <iterate prepend="and" property="personList" open="("          close=")" conjunction="or">          age=$personList[].age$        </iterate>        </delete>

 具体细节,可以参考文章:

而网上有一些文章说去掉iterator中的propetry的方式,由于没有写的很明确不知道是与这个类似,还是与第一个例子类似。想知道细节的可以看这个文章: 

 

当然我上面用到了对象,肯定不会是只查一个属性就ok的,肯定是要多个属性动态组合查询,否则我就直接用第一个例子好了,费下面这些事干嘛。而在组合动态查询的时候,也发现了一些问题:

 

select * from tableName where disabled = 0<dynamic prepend="AND">            <iterate open="(" close=")" property="list" conjunction=" OR ">                (                <isNotNull property="list[].id">                    ID = #list[].id# AND                </isNotNull>                <isNotNull property="list[].channel">                    CHANNEL = #list[].channel# AND                </isNotNull>                <isNotEmpty property="list[].reservationId">                    RESERVATION_ID = #list[].reservationId# AND                </isNotEmpty>                1=1                )            </iterate>        </dynamic>

 

上面的的第一个问题是:为啥 and要自己加,而不是在isNotNull中加prepend=“AND”原因就是在iterator中,发现只有第一次循环:<isNotNull prepend="and"property="list[].id"> 中不会自动加and,第而次会自动加的。

 

再就是 $personList[].age$ 与 #list[].reservationId#其实这两个是一样的,唯一区别在于,第一个是直接将值输出,第二个则会拼成?号,然后组装。

 

感觉写的有点乱,但是具体遇到这个问题的时候看看,肯定是可以明白的。

<update id="updkjrcdjbout"parameterClass="java.util.HashMap" >
     UPDATE TB_YW_KJRCDJB_OUT SET IS_EXPORT='1'
     WHERE
     <iterate open="(" close=")" property="list"conjunction=" OR ">
       ID=#list[].id#
     </iterate>
  </update>

0 0
原创粉丝点击