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对象的一个属性(小声告诉你,这是我猜的,并且没有求证过~~~)

可以参考文章:iBatis: Support for Array or List Parameter with SQL IN Keyword

然而上面一种情况可能不会是我们常用的一种方式,我们可能参数直接就是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>

 具体细节,可以参考文章:ibatis中iterate的用法 iterator iter

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

当然我上面用到了对象,肯定不会是只查一个属性就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# 其实这两个是一样的,唯一区别在于,第一个是直接将值输出,第二个则会拼成?号,然后组装。

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

猜你喜欢

转载自phpxiaoxin.iteye.com/blog/1040364