`
phpxiaoxin
  • 浏览: 253622 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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# 其实这两个是一样的,唯一区别在于,第一个是直接将值输出,第二个则会拼成?号,然后组装。

 

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

分享到:
评论

相关推荐

    ibatis入门与ibatis迭代的用法

    在处理查询结果时,iBatis提供了迭代的用法,可以方便地遍历查询结果集。以下是一个基本示例: ```java List&lt;User&gt; users = sqlSession.selectList("com.example.mapper.getUserList"); for (User user : users) { ...

    iBATIS内置别名列表

    15. **iterator**:`java.util.Iterator` #### 四、数据源工厂类型 数据源工厂负责创建和管理数据源实例。iBATIS支持以下几种数据源工厂类型的内置别名: 1. **SIMPLE**:`...

    ibatis struts集成案例

    在UserMgrAction中,我们可以创建一个对应的方法,比如`listUsers()`,并在这里调用iBatis的SqlSession: ```java public String listUsers() { SqlSession session = sqlSessionFactory.openSession(); List...

    Struts2+Spring2+iBatis2整合的例子

    例如,定义一个用户管理的Action,包括添加、删除、修改和查询用户的操作。 4. **Spring配置**:创建spring.xml文件,定义Bean的配置,包括Action类、Service接口及其实现类,以及数据源和SqlSessionFactory。使用@...

    ibatis的两种方式实现批处理.doc

    for (Iterator&lt;Examlog&gt; iter = examlogList.iterator(); iter.hasNext();) { Examlog log = iter.next(); smc.update("insertExamlog", log); } smc.executeBatch(); } catch (Exception e) { // TODO: ...

    ssi整合开发包括分页

    在iBatis中,我们可以创建一个包含分页参数(如当前页数、每页记录数)的Mapper接口方法,并在对应的XML映射文件中编写带有分页逻辑的SQL语句。例如: ```java public interface UserMapper { List&lt;User&gt; ...

    SSH框架部分常见面试题.pdf

    list() 和 iterator() 是 Hibernate 中的两个查询方法,list() 用于返回查询结果的列表,iterator() 用于返回查询结果的迭代器。 Hibernate 的缓存机制 Hibernate 的缓存机制用于加速数据库查询,缓存机制可以分为...

    mybatis-cursor:mybatis光标问题(https

    在MyBatis中,`Cursor`接口位于`org.apache.ibatis.cursor`包下,它是`java.util.Iterator`的扩展,提供了一种流式处理查询结果的方式。当执行一个返回多条记录的Mapper方法时,可以选择返回`Cursor`对象。使用`...

Global site tag (gtag.js) - Google Analytics