`
胡小米
  • 浏览: 77295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis实现Iterate的使用(转)

 
阅读更多
<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资料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; `...

    Ibatis复杂查询语句.doc

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

    Ibatis查询Id列表.doc

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

    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 dynamic 用法

    Dynamic SQL 在 ibatis 中主要通过以下几种标签实现: 1. **`&lt;dynamic&gt;`**:用于包含动态 SQL 片段。 2. **二元标签**:这些标签通常用于处理布尔表达式的情况,如 `&lt;if&gt;`、`&lt;choose&gt;` 等。 3. **一元标签**:用于...

    iBatis操作

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

Global site tag (gtag.js) - Google Analytics