`

(转)ibatis实现Iterate的使用

阅读更多
源自http://hongzhguan.iteye.com/blog/1222353
<iterate 



    property="" /*可选,  



        从传入的参数集合中使用属性名去获取值,  



        这个必须是一个List类型,  



        否则会出现OutofRangeException,  



        通常是参数使用java.util.Map时才使用,  



        如果传入的参数本身是一个java.util.List, 不能只用这个属性. 



        不知道为啥官网: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html#id386679 



        说这个属性是必须的, 但是测试的时候是可以不设置这个属性的, 还望那位大虾知道, 讲解一下. 



        */ 



    conjunction="" /*可选,  



        iterate可以看作是一个循环,  



        这个属性指定每一次循环结束后添加的符号,  



         比如使每次循环是OR的, 则设置这个属性为OR*/ 



    open="" /*可选, 循环的开始符号*/ 



    close="" /*可选, 循环的结束符号*/ 



    prepend="" /*可选, 加在open指定的符号之前的符号*/ 



>



</iterate>

<!-- 批量删除对象的时候,iterate不要property属性 -->

<delete id="delStudybook" parameterClass="java.util.List">

delete FROM STUDYBOOK WHERE ID IN

<iterate conjunction="," open="(" close=")">

  #bookList[]#

</iterate>

</delete>

注意要property的错误

Caused by: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1

//另外:如果parameterClass="java.util.List"类型不匹配的话

报错Caused by: java.sql.SQLException: Invalid parameter object type.  Expected 'java.util.Map' but found 'java.util.ArrayList'.

===============================

<!--批量修改对象,iterate必须包括property属性-->

<update id="updateUsersIterate" parameterClass="java.util.Map">

update users set user_name=#userInfo.user_name# where user_id in

<iterate property="list" conjunction="," open="(" close=")">

  #list[]#

</iterate>

</update>

注意不要property属性的错误

Cause: com.ibatis.sqlmap.client.SqlMapException: ParameterObject or property was not a Collection, Array or Iterator.

===============================



<!-- Iterate的使用,根据多个匹配条件查询,类似in(a,b,c)-->

<select id="selectByIterate" parameterClass="java.util.List" resultClass="user">

SELECT * FROM USERS WHERE USER_ID IN

<iterate conjunction="," open="(" close=")">

  #ids[]#

</iterate>

</select>

注意:不要property属性,否则报错。String index out of range: -1

        2. 但是,若参数有多个传入的一个是List,另一个不是, parameterClass为map时,需要property属性区分要遍历的  集合。

=================================================



<!--批量增加对象-->

<insert id="BarkInsertUsers" parameterClass="java.util.List">

insert all

<iterate conjunction="">

into users(user_id,user_name,password,address,telephone,email,create_date)

values(#list[].user_id#,#list[].user_name#,#list[].password#,

#list[].address#,#list[].telephone#,#list[].email#,#list[].create_date#)

</iterate>

<!--必须要加上 -->

  select * from dual

</insert>



注意:本打算使主键实现自动增长,但是使用了hibernate_sequence.NEXTVAL,报错

违反唯一约束条件 (SCOTT.SYS_C0010057),请高手指点下。

==================================================



测试上边的配置SQL语句。



//删除书籍的信息

  public int deleteStudyBook(List<Integer> bookList){

 

         try {

return this.client.delete("delStudybook",bookList);

} catch (SQLException e) {

e.printStackTrace();

return 0;

}

  }







//修改用户的信息

  public int updateUsers(Map<String,Object> map){

         try {

return this.client.delete("updateUsersIterate",map);

} catch (SQLException e) {

e.printStackTrace();

return 0;

}

  }





//使用Iterate实现批量插入数据

  public void barkInsert(List<Users> list){

  try {

this.client.insert("BarkInsertUsers",list);

} catch (SQLException e) {

e.printStackTrace();

}

  }



=========================



//测试iterate实现类似in的功能查询

public void queryByIterate(List<Integer> ids){

try {

List<Users> list=this.client.queryForList("selectByIterate",ids);

for (Users user : list) {

System.out.println("user====I"+user.toString());

}

} catch (Exception e) {

e.printStackTrace();

}

}

=========================

Test测试类中的测试过程



//测试的删除

List<Integer> list=new ArrayList<Integer>();

list.add(1);

list.add(2);

//删除书籍

dao.deleteStudyBook(list);

----------------------------------------------------



//测试修改用户信息

Map<String,Object> map=new HashMap<String,Object>();

//设置修改的字段

Users user=new Users();

user.setUser_name("aaaaaaaaaaaaaaaaa");

List<Integer> list1=new ArrayList<Integer>();

list1.add(1);

list1.add(2);

map.put("userInfo",user);

map.put("list",list1);

dao.updateUsers(map);

----------------------------------------------------------

             //测试查询的方法



     List<Integer> list=new ArrayList<Integer>();

list.add(1);

list.add(2);

dao.queryByIterate(list);

---------------------------------------------------------





          //测试批量插入记录

List<Users> userList=new ArrayList<Users>();

//方式一:不适用自动增长列(id设置值:#list[].user_id#)

Users user1=new Users(10,"bbbb","bbbb","bbbb","bbbb","bbbb","bbbb");

Users user2=new Users(11,"cccc","cccc","cccc","cccc","cccc","cccc");

dao.barkInsert(userList);
分享到:
评论

相关推荐

    ibatis中iterate的例子

    除了基本的`&lt;iterate&gt;`用法,还可以结合其他标签如`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`等进行更复杂的逻辑控制,实现动态SQL生成。 总结来说,`&lt;iterate&gt;`标签是iBatis中处理集合数据的重要工具,它简化了...

    ibatis标签

    在源码方面,iBATIS的实现中,`&lt;iterate&gt;`标签的解析和执行是通过SqlMapConfig.xml配置文件加载后,由SqlMapClientBuilder解析,并由Executor执行器来处理。在处理动态SQL时,iBATIS会将`&lt;iterate&gt;`标签转换成对应的...

    ibatis批量处理

    ### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一...此外,合理选择不同的实现方式(如直接使用iBatis API、基于Spring事务管理或使用回调方式),可以使程序更加灵活、高效。

    ibatis list

    ### iBatis批量操作:`&lt;iterate&gt;`标签的使用 `&lt;iterate&gt;`标签是iBatis中用于循环遍历集合的一种机制,它允许你在SQL语句中动态生成参数列表,这对于批量操作(如批量插入、更新或删除)尤为重要。该标签支持多种...

    ibatis批量存储

    Ibatis的iterate标签主要用于循环处理集合数据,它允许我们在动态SQL中实现类似Java的for-each循环。例如,当需要批量插入多条数据时,可以将数据集放入List中,然后在SQL语句中使用iterate标签遍历这个List。...

    常用ibatis配置

    通过上述知识点,我们可以了解到iBatis框架在配置和使用时如何帮助开发者实现数据的插入、查询、更新和删除操作,并且如何通过动态SQL标签来构建灵活且高效的数据库操作。这些知识不仅涵盖了iBatis的核心特性,也...

    iBATIS实战

    3.4.1 在独立应用程序中使用iBATIS 50 3.4.2 在Web应用程序中使用iBATIS 50 3.5 iBATIS和JDBC 51 3.5.1 释放JDBC资源 51 3.5.2 SQL注入 51 3.5.3 降低复杂度 52 3.6 配置iBATIS(续) 53 3.6.1 SQL Map配置文件 54 ...

    ibatis批处理

    在iBatis配置文件中,使用`&lt;iterate&gt;`标签遍历`appDevIds`数组,形成IN条件语句。 **2.2 情况二:多个输入参数循环次数是对称的** 当输入参数的循环次数与操作的次数相匹配时,可以创建一个HashMap,将参数名作为...

    ibatis常用sql语句

    在iBATIS中,当输入参数为单个值时,如示例中的`long`类型,可以使用`&lt;delete&gt;`标签结合`#value#`占位符来构建SQL语句。这里的`#value#`会被实际的参数值替换,从而执行具体的数据库删除操作。这种简单的参数绑定...

    iBATIS动态标签

    通过这些标签,开发者可以在iBATIS的SQL映射文件中实现灵活的动态SQL,如示例所示,可以根据`Account`对象的`username`属性是否存在和其值来决定`WHERE`子句的内容,从而实现更高效和可维护的数据库查询。

    Ibatis常用sql语句

    根据给定的文件信息,以下是对“Ibatis常用...Ibatis通过其动态SQL标签如`iterate`, `isNotNull`, `dynamic`等提供了极高的灵活性,能够有效应对复杂多变的业务需求。掌握这些基本用法对于提升Ibatis开发效率至关重要。

    Ibatis复杂查询语句.doc

    在Ibatis中,复杂查询通常涉及到多个表的联接、条件动态拼接、子查询以及各种数据类型的处理。文档"Ibatis复杂查询语句.doc"所展示的查询语句就是一个很好的例子,展示了Ibatis如何处理复杂的数据库操作。接下来,...

    Ibatis查询Id列表.doc

    文档标题与描述均为“Ibatis查询Id列表.doc”,这表明文档内容主要聚焦于如何使用Ibatis查询ID列表。ID列表在实际应用中通常用于获取一系列记录的主键值,以便后续进行更复杂的操作或查询。 ### 三、查询Id列表的...

    Ibatis资料ibatai sql map iBATIS使用$和#的一些理解

    为了避免这种情况,我们可以使用iBATIS的`iterate`标签来遍历列表: ```xml select * from sys_road_line_info where road_line_no in &lt;iterate open="(" close=")" conjunction=","&gt; #value[]# &lt;/iterate&gt; `...

    ibatis16个常用sql语句

    在iBatis中,删除语句可以使用`&lt;delete&gt;`元素。例如: ```xml delete from MemberAccessLog where accessTimestamp = #value# ``` 上面的语句将删除`MemberAccessLog`表中满足条件`accessTimestamp = #value#`的...

    iBatis的动态SQL语句

    iBatis框架中的动态SQL主要通过XML映射文件来实现,它允许在映射文件中使用各种标签来控制SQL语句的生成过程。这些标签包括但不限于`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;trim&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`...

    ibatis批量删除的方法.docx

    在使用iBatis进行数据操作时,批量删除是常见的需求之一。iBatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在配置文件中,提供了灵活的映射机制,使得Java对象与数据库之间的交互更加便捷。在iBatis中...

    ibatis_3.0_Dynamic_Sql_设计解析(并与2.x的差异)

    在ibatis 2.x中,Dynamic Sql的配置较为繁琐,需要使用特定的标签如`&lt;isNotNull&gt;`、`&lt;iterate&gt;`等来构建动态部分。例如,为了根据参数是否为空来决定是否包含某个条件,需要使用`&lt;isNotNull&gt;`标签,而对于集合参数的...

    iBatis操作

    在iBatis中实现批量操作通常涉及到以下几个关键步骤: 1. **配置文件**:定义SQL语句。 2. **DAO类**:编写执行批量操作的Java代码。 3. **使用Spring框架**:集成iBatis,通过Spring管理事务。 #### 三、配置文件 ...

    ibatis资料

    Ibatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 在Ibatis中,动态查询是其核心特性之一,它允许我们根据业务需求构建灵活...

Global site tag (gtag.js) - Google Analytics