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的使用的更多相关文章
- ibatis的iterate使用
Iterate:这属性遍历整个集合,并为 List 集合中的元素重复元素体的内容. Iterate 的属性: prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选 ...
- ibatis实现Iterate的使用 (转)
<iterate property="" /*可选, 从传入的参数集合中使用属性名去获取值, 这个必须是一 ...
- ibatis使用iterate实现批量插入insert正确写法
由于想批量入库提升效率,最近实现了ibatis的批量插入,结果一直报错 :StringIndexOutOfBoundsException ,原来是value中的格式不正确. 本人邮箱:techqu@1 ...
- ibatis中iterate的用法(conjunction="or" ",")
例子一 查询条件dto public class queryCondition{ private String[] stuIds; private String name;} 查询sqlMap < ...
- iBATIS使用$和#的一些理解
我们在使用iBATIS时会经常用到#这个符号. 比如: sql 代码 select * from member where id =#id# 然后,我们会在程序中给id这个变量传递一个值,iBATIS ...
- ibatis遍历数组:ParameterObject or property was not a Collection, Array or Iterator.
这个问题在使用ibatis的<iterate></iterate>时出现的,很简单,但是蛋疼了很久,记下来 首先从错误提示看,明显意思是你给出ibatis的参数不对路,人家不认 ...
- iBatis.net 循环iterate,没有foreach
3.9.4. Iterate Element This tag will iterate over a collection and repeat the body content for each ...
- ibatis<iterate>标签
<iterate property="" 从传入的参数集合中使用属性名去获取值, 这个必须是一个List类型, 否则会出现OutofRangeException, ...
- 值得注意的ibatis动态sql语法格式
一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...
随机推荐
- 2015.4.20 Canvas Jquery 移动端 JavaScript
1.分享效果:弹窗Canvas渲染大图. 2.进度条中表现进度百分比的数值d%,根据进度的增长“字体颜色”为了表示清晰也随着变化 解决方法:参考Demo. 3.输入框保持查询参数,结果列表局部 ...
- [译]merge vs rebase
git rebase和git merge设计的初衷是解决相同的一件事, 即把一个分支合并到另外一个分支--只是他们两个处理的方式非常不一样. 当你在一个特定的分支开发新功能, 团队的其它成员在mast ...
- [Git] Git基础
远程仓库 查看远程仓库: git remote -v 添加远程仓库: git remote add <repoName> <url> 拉取远程仓库数据: git fetch & ...
- 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- LINQ for XML简单示例
LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展.它允许开发人员以与查询数据库相同的方式操作内存数据.从技术角度而言,LI ...
- sql 创建表、删除表 增加字段 删除字段操作
下面是Sql Server 和 Access 操作数据库结构的常用Sql,希望对你有所帮助. 新建表:create table [表名]([自动编号字段] int IDENTITY (1,1) PRI ...
- Linux下用于查看系统当前登录用户信息 w命令
作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动.有些时候,你甚至需要知道他(她)们正在做什么.本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法. 1. 使用w ...
- 【Network】高性能 UDP 应该怎么做?
参考资料: EPOLL-UDP-GOLANG golang udp epoll - Google 搜索 go - golang: working with multiple client/server ...
- 在虚拟机下安装hadoop集成环境(centos7+hadoop-2.6.4+jdk-7u79)
[1]64为win7系统,用virtualbox建立linux虚拟机时,为什么没有64位的选项? 百度 [2]在virtualbox上安装centos7 [3]VirtualBox虚拟机网络环境解析和 ...