使用mybatis批量操作时,基本都是依靠foreach 标签
关于foreach的用法
可以参考此贴
http://blog.sina.com.cn/s/blog_6a0cd5e501011snl.html
下面是一些摘录
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
批量删除的操作这里就不讨论了,到处都是也比较简单。
先谈下批量插入的问题,由于oracle,和mysql mssql的批量insert语句有一点点区别。
例:
oracle :
insert into sss
(
a,b
)
select '11','aaa' from dual union all
select '22','bbb' from dual
而在mssql和mysql中是这样的:
insert into sss
(
a,b
)
values('1','2'),('11','2')
所有就使用foreach时有一些区别:
例如下
<!-- 批量插入for Oracle -->
<insert id="insertBatch4Oracle" parameterType="List">
insert into aa
(
a,b
)
<foreach collection="list" item="item" index="index" separator="union all" >
select #{item.a},
#{item.b}
from dual
</foreach>
</insert>
<!-- 批量插入for Other -->
<insert id="insertBatch4Other" parameterType="List">
insert into aa
(
a,b
)
VALUES
<foreach collection="list" item="obj" index="index" separator="," >
(
#{obj.a},#{obj.b}
)
</foreach>
</insert>
还有一个批量更新的问题,oracle中 形如 update *** set *** where ** in(....)
这种语句 in所在的集合有条数限制 为1000条,当我们在批量更新千条以上数据时就会有问题,解决方法可以分段在执行,1000条记录为一段。
<update id="updateBatch" parameterType="Map">
update aa set
a=#{fptm},
b=#{csoftrain}
where c in
<foreach collection="cs" index="index" item="item" open="("separator=","close=")">
#{item}
</foreach>
</update>
java代码:
public int updateBatch(BB b, List<String> SS) {
int count = 0;
int len = (SS.size() + 999) / 1000;
List<List<String>> a = new ArrayList<List<String>>();
for (int i = 0; i < len; i++) {
a.add(new ArrayList<String>());
}
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < 1000; j++) {
a.get(i).add(SS.get((i * 1000) + j));
}
}
for (int i = 0; i < SS.size() % 1000; i++) {
a.get(len - 1).add(SS.get(((len - 1) * 1000) + i));
}
for (int i = 0; i < a.size(); i++) {
Map pM = BeanUtils.describe(rp);
pM.put("SS", a.get(i));
this.getSqlSessionTemplate().update(MAPPER_NS + "updateBatch",
pM);
count += a.get(i).size();
}// 分段批量更新
return count;
}
不知道你们有木有更好的办法么,交流交流。
分享到:
相关推荐
Mybatis批量foreach merge into的用法 Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不...
mybatis批量添加的时候报错总结报错 parameter'_frch_item_0 not found
MyBatis Plus 是 MyBatis 的一个扩展,它在 MyBatis 的基础上提供了更多的便捷功能,包括但不限于批量操作。在数据库交互中,批量操作能够显著提高效率,减少数据库连接的开销。本测试主要探讨了 MyBatis Plus 中的...
只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢
本文将详细分析Mybatis批量更新的报错问题及其解决方法。 首先,报错可能由于不支持批量更新操作的JDBC配置引起。在MySQL中,如果不开启`allowMultiQueries`参数,Mybatis尝试执行包含多个SQL语句的批量更新时,会...
本文将深入探讨如何在 Mybatis Plus 中自定义批量插入和批量更新,并根据唯一索引来确保数据的唯一性。 首先,了解 Mybatis Plus 的批量操作基础。Mybatis Plus 提供了 `batchInsert()` 和 `batchUpdate()` 方法来...
本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要理解Oracle数据库的一些基本概念。Oracle是世界上最流行的商业关系型数据库管理系统之一,以其强大的功能和高可靠性而...
mybatis 框架批量增删改代码 示例 含java与xml
Mybatis批量更新三种方式的实现 Mybatis是一款流行的持久层框架,它提供了强大的数据库交互能力。其中,批量更新是一种常见的操作,能够提高数据库操作的效率。下面将介绍Mybatis批量更新三种方式的实现。 方式一...
MyBatis 插件机制防止批量更新 MyBatis 是一个流行的持久层框架,它提供了插件机制来拦截 SQL 操作,以便于开发者可以在执行 SQL 语句前进行预处理或后续处理。本文将详细介绍 MyBatis 插件机制的实现原理和应用...
需要注意的是,MyBatis批量插入可能会出现内存不足的问题,因此需要提前修改MySql的配置文件,增加max_allowed_packet的值以避免内存不足的问题。 MyBatis批量插入是一种高效的数据插入方式,可以大大提高插入速度...
MyBatis动态SQL和批量插入的应用 MyBatis是一款功能强大且灵活的持久层框架,提供了多种方式来对数据库进行交互。其中,动态SQL是一种非常强大的特性,能够根据不同的条件生成不同的SQL语句。下面将详细介绍MyBatis...
本文将探讨Mybatis和JDBC在批量插入MySQL数据库时的性能差异,并提供相关的测试资源。 首先,JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一种规范,它允许程序员使用SQL语句直接操作数据库...
【Mybatis批量添加实现详解】 在数据库操作中,批量插入数据是常见的需求,尤其是在处理大量数据时,批量插入能够显著提高效率。Mybatis,作为一款轻量级的持久层框架,提供了灵活的方式来处理批量添加。本文将详细...
MyBatis批量更新数据两种方法效率对比 在MyBatis中,批量更新数据是指在一次数据库交互中更新多条记录的操作。这种操作可以提高应用程序的性能和效率。今天,我们将讨论两种批量更新数据的方法,并对其进行效率对比...
使用方法请看博客https://blog.csdn.net/bandaotixiruiqiang/article/details/72478361#comments_12931827
使用方法请看博客 https://blog.csdn.net/bandaotixiruiqiang/article/details/72478361#comments_12931827
在"mybatis数据操作(增删改查+批量操作)"这个主题中,我们将深入探讨如何利用MyBatis进行基本的数据操作,包括插入(Insert)、删除(Delete)、更新(Update)和查询(Select),以及如何执行批量操作。...
Mybatis实现多表联合查询和批量插入 Mybatis是一款流行的持久层框架,它可以帮助开发者快速、高效地访问数据库。在实际开发中,经常需要对多个表进行联合查询,或者对大量数据进行批量插入。本文将详细介绍如何使用...
本文将深入探讨如何利用MyBatis框架结合MySQL数据库实现批量插入功能,包括其原理、配置、代码实现以及优化策略。 ### 一、MyBatis框架简介 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级...