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:这属性遍历整个集合,并为 List 集合中的元素重复元素体的内容. Iterate 的属性: prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可 ...
- 使用ibatis的iterate标签实现批量插入
ibatis批量插入(使用iterate标签) 1.要注意版本是否支持foreach,我使用的版本就不支持.如果不支持,会报错,叫你必须指定foreach元素类型. 2.使用iterate的List时 ...
- Ibatis实现Iterate
<iterate property="" /*可选, 从传入的参数集合中使用属性名去获取值, 这个必须是一个List类型, 否则会出现OutofRangeException, ...
- ibatis中iterate的用法(conjunction=or ,)
<!-- 删除相应的person记录 --> < delete id =" deletePerson " parameterClass ="m ...
- ibatis中iterate的用法(conjunction=or ,) .
<!-- 删除相应的person记录 --> < delete id =" deletePerson " parameterClass ="m ...
- Oracle model iterate,ibatis实现Iterate的使用
property="" /*可选, 从传入的参数集合中使用属性名去获取值, 这个必须是一个List类型, 否则会出现OutofRangeException, 通 ...
- ibatis中iterate的用法(转载)
PersonDaoImp如下: /** * 删除性别为man,年龄为 11,12 的Person记录 */ public int deletePerson(Map<Str ...
- ibatis批量插入数据-iterate标签详解及应用
Sql代码 insert into tb_name(col1, col2, col3) values (col1_v, col2_v, col3_v), (col1_v, col2_v, c ...
最新文章
- 千亿级数据量的Kafka深度实践
- 人工智能中图神经网络GNN是什么?
- linux中文系统换英文字体,linux系统下肿么切换字体?
- 基于PCA和SVM的人脸识别
- 用鸿蒙取名好吗,“鸿蒙”两个字,还是古人写得好看…
- 子div用了float浮动之后,如何撑开父元素,让父元素div自动适应高度的问题
- soltrace教程(3)基本使用
- 知识图谱够火,但底层技术环节还差点火候 | AI 技术生态论
- 贝塞尔曲线之爱心点赞代码全解析!| CSDN 博文精选
- SQLite不同插入方法的效率对比测试
- 输入法候选词排列的两种新方式
- ofd阅读器qt_采用WPF技术,开发OFD电子文档阅读器
- 全开源即时通讯(IM)系统 高仿微信
- 职称体系岗位等级对照
- 谷歌又闹大乌龙!Jeff Dean参与的新模型竟搞错Hinton生日
- Binet-Cauchy公式
- HR 开发技术(abap 转载)
- Windows远程桌面连接不上虚拟机
- 论文阅读-工作流搭建尝试try1:Readcube+Obsidian
- Pandas: 交叉表(crosstab)和透视表(pivot_table)的用法