`
lohasle
  • 浏览: 254750 次
社区版块
存档分类
最新评论

mybatis批量更新的一些问题

阅读更多
使用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;
	}

不知道你们有木有更好的办法么,交流交流。
4
0
分享到:
评论
3 楼 nanjiwubing123 2014-06-26  
    <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>


oracle的批量新增确实是这样的,但看起来怪怪的。
2 楼 jason_onetwo 2012-12-26  
学习了。。。。
1 楼 在世界的中心呼喚愛 2012-12-06  
我也是这样进行批量删除的。foreach

相关推荐

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法 Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不...

    mybatis批量添加

    mybatis批量添加的时候报错总结报错 parameter'_frch_item_0 not found

    mybatis plus 5种批量操作性能测试

    MyBatis Plus 是 MyBatis 的一个扩展,它在 MyBatis 的基础上提供了更多的便捷功能,包括但不限于批量操作。在数据库交互中,批量操作能够显著提高效率,减少数据库连接的开销。本测试主要探讨了 MyBatis Plus 中的...

    mybatis 批量插入返回主键

    只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢

    Mybatis批量更新报错问题

    本文将详细分析Mybatis批量更新的报错问题及其解决方法。 首先,报错可能由于不支持批量更新操作的JDBC配置引起。在MySQL中,如果不开启`allowMultiQueries`参数,Mybatis尝试执行包含多个SQL语句的批量更新时,会...

    Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)

    本文将深入探讨如何在 Mybatis Plus 中自定义批量插入和批量更新,并根据唯一索引来确保数据的唯一性。 首先,了解 Mybatis Plus 的批量操作基础。Mybatis Plus 提供了 `batchInsert()` 和 `batchUpdate()` 方法来...

    Java实现mybatis批量插入数据到Oracle

    本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要理解Oracle数据库的一些基本概念。Oracle是世界上最流行的商业关系型数据库管理系统之一,以其强大的功能和高可靠性而...

    mybatis批量增删改.txt

    mybatis 框架批量增删改代码 示例 含java与xml

    Mybatis批量更新三种方式的实现

    Mybatis批量更新三种方式的实现 Mybatis是一款流行的持久层框架,它提供了强大的数据库交互能力。其中,批量更新是一种常见的操作,能够提高数据库操作的效率。下面将介绍Mybatis批量更新三种方式的实现。 方式一...

    MyBatis防止批量更新1

    MyBatis 插件机制防止批量更新 MyBatis 是一个流行的持久层框架,它提供了插件机制来拦截 SQL 操作,以便于开发者可以在执行 SQL 语句前进行预处理或后续处理。本文将详细介绍 MyBatis 插件机制的实现原理和应用...

    MyBatis批量插入Update

    需要注意的是,MyBatis批量插入可能会出现内存不足的问题,因此需要提前修改MySql的配置文件,增加max_allowed_packet的值以避免内存不足的问题。 MyBatis批量插入是一种高效的数据插入方式,可以大大提高插入速度...

    10万条数据下MySQL批量更新6种方式的性能测试.zip

    包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...

    MyBatis动态SQL,MyBatis批量插入(Oracle数据库)[收集].pdf

    MyBatis动态SQL和批量插入的应用 MyBatis是一款功能强大且灵活的持久层框架,提供了多种方式来对数据库进行交互。其中,动态SQL是一种非常强大的特性,能够根据不同的条件生成不同的SQL语句。下面将详细介绍MyBatis...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    本文将探讨Mybatis和JDBC在批量插入MySQL数据库时的性能差异,并提供相关的测试资源。 首先,JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一种规范,它允许程序员使用SQL语句直接操作数据库...

    mybatis批量添加实现1

    【Mybatis批量添加实现详解】 在数据库操作中,批量插入数据是常见的需求,尤其是在处理大量数据时,批量插入能够显著提高效率。Mybatis,作为一款轻量级的持久层框架,提供了灵活的方式来处理批量添加。本文将详细...

    详解mybatis 批量更新数据两种方法效率对比

    MyBatis批量更新数据两种方法效率对比 在MyBatis中,批量更新数据是指在一次数据库交互中更新多条记录的操作。这种操作可以提高应用程序的性能和效率。今天,我们将讨论两种批量更新数据的方法,并对其进行效率对比...

    mybatis-generator,一对一,一对多,批量更新插入

    使用方法请看博客https://blog.csdn.net/bandaotixiruiqiang/article/details/72478361#comments_12931827

    mybatis-generator,一对一,一对多,批量更新插入2

    使用方法请看博客 https://blog.csdn.net/bandaotixiruiqiang/article/details/72478361#comments_12931827

    mybatis数据操作(增删改查+批量操作)

    在"mybatis数据操作(增删改查+批量操作)"这个主题中,我们将深入探讨如何利用MyBatis进行基本的数据操作,包括插入(Insert)、删除(Delete)、更新(Update)和查询(Select),以及如何执行批量操作。...

    Mybatis实现多表联合查询和批量插入

    Mybatis实现多表联合查询和批量插入 Mybatis是一款流行的持久层框架,它可以帮助开发者快速、高效地访问数据库。在实际开发中,经常需要对多个表进行联合查询,或者对大量数据进行批量插入。本文将详细介绍如何使用...

Global site tag (gtag.js) - Google Analytics