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# 其实这两个是一样的,唯一区别在于,第一个是直接将值输出,第二个则会拼成?号,然后组装。
感觉写的有点乱,但是具体遇到这个问题的时候看看,肯定是可以明白的。
分享到:
相关推荐
在处理查询结果时,iBatis提供了迭代的用法,可以方便地遍历查询结果集。以下是一个基本示例: ```java List<User> users = sqlSession.selectList("com.example.mapper.getUserList"); for (User user : users) { ...
15. **iterator**:`java.util.Iterator` #### 四、数据源工厂类型 数据源工厂负责创建和管理数据源实例。iBATIS支持以下几种数据源工厂类型的内置别名: 1. **SIMPLE**:`...
在UserMgrAction中,我们可以创建一个对应的方法,比如`listUsers()`,并在这里调用iBatis的SqlSession: ```java public String listUsers() { SqlSession session = sqlSessionFactory.openSession(); List...
例如,定义一个用户管理的Action,包括添加、删除、修改和查询用户的操作。 4. **Spring配置**:创建spring.xml文件,定义Bean的配置,包括Action类、Service接口及其实现类,以及数据源和SqlSessionFactory。使用@...
for (Iterator<Examlog> iter = examlogList.iterator(); iter.hasNext();) { Examlog log = iter.next(); smc.update("insertExamlog", log); } smc.executeBatch(); } catch (Exception e) { // TODO: ...
在iBatis中,我们可以创建一个包含分页参数(如当前页数、每页记录数)的Mapper接口方法,并在对应的XML映射文件中编写带有分页逻辑的SQL语句。例如: ```java public interface UserMapper { List<User> ...
list() 和 iterator() 是 Hibernate 中的两个查询方法,list() 用于返回查询结果的列表,iterator() 用于返回查询结果的迭代器。 Hibernate 的缓存机制 Hibernate 的缓存机制用于加速数据库查询,缓存机制可以分为...
在MyBatis中,`Cursor`接口位于`org.apache.ibatis.cursor`包下,它是`java.util.Iterator`的扩展,提供了一种流式处理查询结果的方式。当执行一个返回多条记录的Mapper方法时,可以选择返回`Cursor`对象。使用`...