`
TableMiao
  • 浏览: 75416 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

mybatis 批量操作

阅读更多

MyBatis  批量操作

       记录下常用的批量操作,增删改,处理模式一致。

 

       一.批量新增

          1.采用union all  拼接sql,导致问题sql过长,耗时,性能不好,且达到一定量会超出sql长度限制,不推荐

              一般20字段以内的表新增,数据2000条以内可用,经过测试。

            

              dao层:         

      /***
	 * 批量新增方法一
	 *    sql拼接
	 * @return
	 */
	public boolean insertMethodOne(List<Map<String,Object>> list){
		return sqlSessionTemplate.insert(super.nameSpaces+"insertMethodOne",list)==1;
	}

 

 

              mapper文件:        

<!-- 批量新增   方法一 (sql内做循环,拼接sql,但sql会越来越长,一定量之后会抛出长度限制的错误,性能也不好,大致是适用2000条以内)-->
	<insert id="insertMethodOne" parameterType="List">
	    insert into gdgk_test_user(id,name,password)
	    (
	    <foreach collection="list" item="item" index="index" separator="union all">
	    	select #{item.id,jdbcType=VARCHAR},#{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR}
	    	from dual
	    </foreach>
	    )
	</insert>

          很多时候我们采用的id是通过序列得到的,所以我们拼接的sql是这样子

 

	<insert id="insertMethodOne" parameterType="List">
		<selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="id">
			SELECT SLA_SEQUENCE.NEXTVAL FROM DUAL
	    </selectKey>
	    insert into gdgk_test_user(id,name,password)
	    (
	    <foreach collection="list" item="item" index="index" separator="union all" >
		    select #{id,jdbcType=DECIMAL},#{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR}
		    	from dual
	    </foreach>
	    )
	</insert>

           这样问题就出来了,如果数据库做了主键唯一约束,这里就违反了,每次批量新增的时候id不变,永远是第一次从序列里面拿到的,所以解决如下:

 

	<insert id="insertMethodOne" parameterType="List">
	    insert into gdgk_test_user(id,name,password)
        select SLA_SEQUENCE.NEXTVAL,A.* from
	    (
	    <foreach collection="list" item="item" index="index" separator="union all" >
		    select #{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR}
		    	from dual
	    </foreach>
	    ) A
	</insert>

            首先把id放进去,实体里面的东西 不需要带入id的任何属性

 

 

           2.采用dao层循环,得到sqlsession  统一commit,推荐

 

            dao层:        

      /***
	 * 批量新增方法二
	 *    dao循环,获取session 统一commit
	 * @return
	 */
	public boolean insertMethodTwo(List<Map<String,Object>> list){
		SqlSession session = sqlSessionTemplate.getSqlSessionFactory()
				.openSession(ExecutorType.BATCH, false);
		for (Map<String,Object> rec : list)
			sqlSessionTemplate.insert(super.nameSpaces+"insertMethodTwo", rec);
		session.commit();
		return true;
	}

        

          mapper文件:

          

    <!--批量新增   方法二(dao层做循环,推荐)  -->
	<insert id="insertMethodTwo" parameterType="Map">
	    insert into gdgk_test_user(id,name,password)
	    values (#{id,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR})
	</insert>

    

        3.Test类:

         

        @Test
	@SuppressWarnings("all")
	public void test() {
		ApplicationContext con = new ClassPathXmlApplicationContext(
				"base.xml", TestMssiSql.class);
		UserDao	userDao = con.getBean(UserDao.class);
		
		List<Map<String,Object>> listOne = new ArrayList<>();
		for(int i=10;i<14;i++){
			Map<String,Object> mapOne = new HashMap<>();
			mapOne.put("id", i);
			mapOne.put("name", "新增方法一");
			mapOne.put("password", "123");
			listOne.add(mapOne);
		}	
		userDao.insertMethodOne(listOne);
		logger.info("批量新增调用第一个方法完成");
		
		List<Map<String,Object>> listTwo = new ArrayList<>();
		for(int i=14;i<18;i++){
			Map<String,Object> mapTwo = new HashMap<>();
			mapTwo.put("id", i);
			mapTwo.put("name", "新增方法二");
			mapTwo.put("password", "123");
			listTwo.add(mapTwo);
		}
		userDao.insertMethodTwo(listTwo);
		logger.info("批量新增调用第二个方法完成");
		
	}

 

             批量修改一致,可用dao层循环那种法子,批量删除略为不同,每次带入id进行删除,也可采用in的方式拼接sql

      

            dao: 

      /***
	 * 批量删除
	 *   只循环id  sql in方式拼接
	 * @param list
	 * @return
	 */
	public boolean deleteBatch(List<String> list){
		return sqlSessionTemplate.delete(super.nameSpaces+"deleteBatch",list)==1;
	}

     

          mapper文件:    

<!-- 批量删除   -->
	<delete id="deleteBatch" parameterType="List">
		delete gdgk_test_user
		where id in
		<foreach item="item" index="index" collection="list"
			open="(" separator="," close=")">
			#{item}
		</foreach>
	</delete>

      

          Test:

             List<String>  ids = new ArrayList<>();
		for(int i=10;i<20;i++){
			ids.add(String.valueOf(i));
		}
		userDao.deleteBatch(ids);
		logger.info("批量删除方法完成");

 

  记录一下,方便温习……

 

           

2
2
分享到:
评论
1 楼 weijs 2015-01-04  
我用的方法一,但是把union all  改为“;”(separator=";"),然后启用mybatis的批量模式;

<!-- 对于批量更新操作缓存SQL以提高性能   -->
<setting name="defaultExecutorType" value="BATCH" />

方法二需要单独控制事务感觉不太好

相关推荐

    Mybatis批量foreach merge into的用法

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

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

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

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

    在Java开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作,使得开发者可以更加专注于SQL语句的编写。本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要...

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

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

    MyBatis批量插入Update

    * 不需要额外添加回滚处理:MyBatis批量插入可以自动处理回滚操作,无需额外添加回滚处理。 需要注意的是,MyBatis批量插入可能会出现内存不足的问题,因此需要提前修改MySql的配置文件,增加max_allowed_packet的...

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

    通过这样的性能测试,我们可以了解到在特定场景下,Mybatis和JDBC哪个更适合批量插入操作。通常,Mybatis由于其封装和优化,可能会在易用性和性能之间取得更好的平衡。但具体选择应根据项目需求和实际环境进行权衡。...

    mybatis批量添加实现1

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

    mybatis 通用分页插件和批量操作插件

    NULL 博文链接:https://hzs0502030128.iteye.com/blog/2254585

    MyBatis批量插入(insert)数据操作

    此外,对于支持批量操作的数据库(如MySQL),还可以利用数据库级别的批量插入API来进一步提升性能。 总的来说,MyBatis的批量插入功能结合了Java代码的灵活性和SQL的高效性,是处理大批量数据插入的理想选择。通过...

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

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

    Mybatis批量删除多表

    Mybatis批量删除多表 MyBatis是一个功能强大且灵活的持久层框架,它能够帮助开发者快速高效地实现数据的持久化操作。在实际开发中,我们经常需要对多个表进行批量删除操作,这时就需要使用MyBatis的批量删除功能。...

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

    Mybatis Plus 是 Mybatis 的一个扩展工具,它在 Mybatis 的基础上提供了许多便捷的功能,包括自动 CRUD 操作、条件构造器、批量操作等。在实际的项目开发中,批量插入和批量更新是常见的数据处理场景,尤其是在处理...

    Mybatis 3+Mysql 实现批量插入

    综上所述,利用MyBatis结合MySQL实现批量插入不仅可以大幅提高数据处理效率,还能有效降低系统资源消耗,是数据库操作中不可或缺的一项技能。通过上述详细讲解,相信读者已经对如何实现批量插入有了清晰的理解。

    Mybatis批量修改的操作代码

    Mybatis批量修改操作代码详解 Mybatis是一款流行的持久层框架,提供了批量修改操作的功能。本文将详细介绍Mybatis批量修改的操作代码,包括批量修改的基本语法、参数说明、trim标签的使用等。 一、基本语法 ...

    mybatis postgresql 批量删除操作方法

    MyBatis PostgreSQL 批量删除操作方法 MyBatis 是一个基于 Java 的持久层框架,它提供了一个简单的方式来交互数据库。在本文中,我们将介绍如何使用 MyBatis 实现 PostgreSQL 批量删除操作。 PostgreSQL 简介 ...

    mybatis 批量插入 嵌套select.pdf

    这个问题的描述是关于如何在MyBatis中正确地执行一个批量插入操作,其中一个字段的值依赖于对同一张表的SELECT查询结果。 原始的XML映射文件中的SQL插入语句尝试在FROM子句中直接更新目标表'chat_messages',这是不...

    MyBatis批量添加、修改和删除

    总结来说,MyBatis 提供的批量操作功能通过动态 SQL 和集合遍历来简化大量数据处理,提高了数据库操作的效率。开发者可以根据实际需求选择合适的批量操作方式,并通过编写 SQL 映射文件来定制操作逻辑。注意,批量...

    基于mybatis batch实现批量提交大量数据

    MyBatis批量提交大量数据是一种高效的数据批量操作方式,通过MyBatis的BATCH方式执行增删改方法,可以实现在短时间内处理大量数据。下面对MyBatis批量提交大量数据的实现进行了详细的介绍。 MyBatis批量提交的优点 ...

    SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

    在本项目中,我们主要探讨的是如何利用SpringBoot集成Mybatis框架进行大数据量(例如500万条)的批量插入操作,并将其高效地存入MySQL数据库。这个Demo旨在提供一个学习实例,帮助开发者理解并优化大数据处理的性能...

    Mybatis批量插入的四种方式.docx

    Mybatis批量插入的四种方式 Mybatis 是一个流行的 Java 持久层框架,提供了多种方式来实现批量插入操作。下面将详细介绍 Mybatis 批量插入的四种方式。 1. 循环插入 循环插入是最简单的批量插入方式,即通过循环...

Global site tag (gtag.js) - Google Analytics