<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=","  property="aaa"
 open="(" close=")">
  #aaa[]#
 </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,对着部分不熟悉!记录下!

ibatis实现Iterate的使用 (转)的更多相关文章

  1. ibatis的iterate使用

    Iterate:这属性遍历整个集合,并为 List 集合中的元素重复元素体的内容. Iterate 的属性:       prepend  - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选 ...

  2. ibatis实现Iterate的使用

    <iterate property="" /*可选, 从传入的参数集合中使用属性名去获取值, 这个必须是一个List类型, 否则会出现OutofRangeException, ...

  3. ibatis使用iterate实现批量插入insert正确写法

    由于想批量入库提升效率,最近实现了ibatis的批量插入,结果一直报错 :StringIndexOutOfBoundsException ,原来是value中的格式不正确. 本人邮箱:techqu@1 ...

  4. ibatis中iterate的用法(conjunction="or" ",")

    例子一 查询条件dto public class queryCondition{ private String[] stuIds; private String name;} 查询sqlMap < ...

  5. iBATIS使用$和#的一些理解

    我们在使用iBATIS时会经常用到#这个符号. 比如: sql 代码 select * from member where id =#id# 然后,我们会在程序中给id这个变量传递一个值,iBATIS ...

  6. ibatis遍历数组:ParameterObject or property was not a Collection, Array or Iterator.

    这个问题在使用ibatis的<iterate></iterate>时出现的,很简单,但是蛋疼了很久,记下来 首先从错误提示看,明显意思是你给出ibatis的参数不对路,人家不认 ...

  7. iBatis.net 循环iterate,没有foreach

    3.9.4. Iterate Element This tag will iterate over a collection and repeat the body content for each ...

  8. ibatis<iterate>标签

    <iterate  property="" 从传入的参数集合中使用属性名去获取值,   这个必须是一个List类型,   否则会出现OutofRangeException, ...

  9. 值得注意的ibatis动态sql语法格式

    一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...

随机推荐

  1. ssh免密码登录的注意事项

    centos配置完免密码登录(注意修改配置文件,/etc/ssh/sshd_config),合并完公钥后,有的时候还得需要输入密码.这时候应该检查一下authorized_keys的权限问题.本机的正 ...

  2. How does a single thread handle asynchronous code in JavaScript?

    原文:https://www.quora.com/How-does-a-single-thread-handle-asynchronous-code-in-JavaScript ----------- ...

  3. 固态硬盘(Solid State Drives)

    固态硬盘(Solid State Drives) 学习了:https://baike.baidu.com/item/%E5%9B%BA%E6%80%81%E7%A1%AC%E7%9B%98/45351 ...

  4. [PWA] Customize the Splash Screen of a PWA built with create-react-app

    Android displays a splash screen for PWAs based on the icons and names you provide, but iOS just dis ...

  5. Node.js 使用jQuery取得Nodejs http服务端返回的JSON数组示例

    server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http" ...

  6. Spring3的quartz定时任务

    要使用定时任务,需要将quartz-1.5.2.jar加入lib,没有的话可以从下面地址下载: quartz-1.5.2.jar 有了这个再做个配置文件appctx-quartz.xml: <? ...

  7. Windows网页上碰到无法完全显示的图片怎么办

    如图所示,下一幅图片只能显示一半. 我们选中并在新标签中打开 一般即可正常显示,如果还不行,留意地址栏,这就是这个图片的真实地址,我们完全可以用迅雷直接把这幅图片下载下来. 我们甚至可以猜测,去掉后缀 ...

  8. 双人对战的球类游戏ios源代码项目

    双人对战的球类游戏源代码,这个是一款双人对战的ios球类游戏源代码.游戏的源代码也比較具体的,我们在屏幕上下看到各有一个球门.内有一球,两边通过控制轮盘使球进入对方的球门的.事实上玩法也非常easy的 ...

  9. springboot @Configuration

    有了@Configuration,原来的springBean的配置文件可以去掉了, 原来在application.xml中配置的bean可以配置在@Configuration注解的来类中,使用@Bea ...

  10. php 处理 form 表单提交多个 name 属性值相同的 input 标签

    一 问题 在公司的开发过程中,遇到了一个问题:如何处理 form 表单提交了多个 name 属性值相同的 input 标签?源码如下(源码是在 form 表单之中的): <!--{loop $a ...