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# 其实这两个是一样的,唯一区别在于,第一个是直接将值输出,第二个则会拼成?号,然后组装。
感觉写的有点乱,但是具体遇到这个问题的时候看看,肯定是可以明白的。