<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>`标签是一个非常实用的功能,它允许我们处理集合数据,如数组、List或Map等,进行循环遍历并生成动态SQL语句。下面我们将详细探讨`<iterate>`标签的用法及其示例。 `<iterate>`标签的主要...
在Ibatis SqlMap 2.3.0中,它为开发者提供了这样的功能,允许在SQL语句中使用通配符来实现这种需求。 1. **通配符的种类**: - `%`:代表任意多个字符,包括零个字符。例如,在`LIKE 'abc%'`中,可以匹配到以"abc...
SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。Sql Map配置文件是iBatis配置的核心,从数据库连接到执行SQL时使用的sqlMap文件都是通过此文件中的配置提供给框架的,它通常命名为...
在 iBatis 框架中,SQLMap配置是整个应用程序的核心部分,占据了大部分的开发工作。下面将详细解析 iBatis 中SQLMap配置的关键知识点: 1. **命名空间(Namespace)**: 命名空间是iBatis配置中的一个重要概念,它...
对于SQL语句的执行,SqlMapClient使用Executor接口,该接口定义了不同类型的SQL执行策略,如SimpleExecutor、ReuseExecutor和BatchExecutor,分别对应简单执行、重用预编译语句和批量操作。 深入源码,我们可以看到...
ibatis sqlMap dtd ibatis sqlMap dtdibatis sqlMap dtdibatis sqlMap dtdibatis sqlMap dtd
iBATIS SQLMap是一款在Java应用中广泛使用的持久层框架,它将SQL语句与Java代码分离,使得数据库操作更加灵活、易于维护。这个框架的主要目的是简化数据访问层的开发,减少开发人员编写大量重复的JDBC代码。下面将...
4. 易于集成:Ibatis-SqlMap可以方便地与Spring等其他框架集成,简化应用开发。 五、使用流程 1. 配置SqlMapConfig.xml:定义数据源、事务管理器以及SqlMap的路径。 2. 创建SqlMapClient:根据SqlMapConfig.xml配置...
【标题】"ibatis-sqlMap-入门教程(代码)" 涉及的知识点主要集中在使用MyBatis(原iBATIS)框架进行数据库操作的初步实践上。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,避免了几乎...
在`ibatis-sqlmap-2.jar.zip`中,虽然未直接提供具体的SQL映射文件,但在实际应用中,开发者会根据需求创建这些XML文件,定义SQL语句和结果映射。 2. SQL执行:在iBatis中,通过`SqlSession`接口来执行SQL。例如,`...
### ibatis应对批量update 在处理大量数据更新时,传统的for循环方式往往...总之,ibatis提供的批量更新功能是处理大量数据更新场景的一个强大工具,开发者应该熟练掌握并合理利用这一特性来提升应用程序的整体性能。
通常,这样的文章会包含如何配置SqlMapConfig.xml,编写SQLMap文件,以及如何在Java代码中使用SqlSession进行数据交互等内容。 【标签】:“源码”、“工具” “源码”标签暗示我们可能讨论Ibatis的内部工作原理,...
在描述中提到的博文链接,虽然没有提供具体内容,但通常博主会分享如何使用`<iterate>`标签以及在实际开发中的应用案例。通过访问该链接(https://duqiangcise.iteye.com/blog/286764),我们可以深入学习关于`...
在IT行业中,数据库操作是日常开发中的重要环节,而Ibatis作为一款优秀的持久层框架,大大简化了Java应用与数据库的交互。Ibatis的SqlMap配置文件是其核心部分,用于定义SQL语句、参数映射和结果映射,但手动编写...
ibatis-sqlmap-2.jar 对数据库进行操作的jar包 很方便使用
4. **处理事务**:如果正在执行的事务中涉及了已更新的SQL,可能需要回滚事务,确保不会因为使用旧的SQL而导致数据不一致。在更新映射文件后,可以暂停当前事务,重新执行受影响的操作。 5. **日志记录**:为了便于...
iBATIS SQLMap的这个版本增加了对多种数据库的透明支持,这意味着开发者无需关心底层使用的具体数据库类型,只需使用通用的API,框架会自动根据配置转换为对应数据库的SQL,降低了跨数据库迁移的成本。 从压缩包子...
4. **元素**:为Java类型定义别名,便于在XML配置中使用。 5. **元素**:定义事务管理器,指定事务的实现方式。 6. **元素**:配置数据源,用于获取数据库连接。 7. **<sqlMap>元素**:包含具体的SQL映射规则。 ###...
`<typeAlias>`用于为Java实体类创建简短的别名,方便在配置文件中使用。如`<typeAlias alias="Account" type="com.lavasoft.ibatissut.simple.domain.entity.Account"/>`,在需要使用Account类的地方,可以直接用...
在实际应用中,通常会将iBatis与Spring框架结合使用,利用Spring提供的事务管理能力。在这种情况下,可以通过Spring的AOP(面向切面编程)特性自动处理事务的开启、提交和回滚等操作。 示例代码如下: ```java ...