`

MyBatis批量新增和更新

阅读更多
网上参考了下总结:在连接SQL后面加上:&allowMultiQueries=true 才能实现批量更新

一、批量添加
1、XML
<insert id="addBatchs" useGeneratedKeys="true" parameterType="java.util.List">  
		    <selectKey resultType="long" keyProperty="id" order="AFTER">  
		        SELECT  
		       	 	LAST_INSERT_ID() AS ID
		    </selectKey>  
	    	INSERT INTO A (aa)   
	    	VALUES  
		    <foreach collection="list" item="item" index="index" separator="," >  
		        (#{item.aa})
		    </foreach>  
	</insert>  

2、代码方法体

        int result = 0;
        if (collections == null || collections.isEmpty()) {
            return result;
        }
        SqlSession batchSqlSession = null;
        try {
            // 获取批量方式的sqlsession
            batchSqlSession = getSqlSessionTemplate().getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
            String insertSqlId = getStatement("addBatchs");
            // 每批commit的个数 > 100
            int startIndex = 0;
            int temps = 100;
            int size = collections.size();
            int count = (size % temps == 0) ? (size / temps) : (size / temps) + 1;
            boolean tag = false;
            for (int i = 0; i < count; i++) {
                if (tag) {
                    break;
                }
                if (temps > size) {
                    temps = size;
                    tag = true;
                }
                List<T> tempLists = collections.subList(startIndex, temps);
                batchSqlSession.insert(insertSqlId, tempLists);
                result += tempLists.size();
                startIndex = temps;
                temps += 100;
                batchSqlSession.commit();
                batchSqlSession.clearCache();
            }
        } catch (Exception e) {
            batchSqlSession.rollback();
        } finally {
            batchSqlSession.close();
        }
        return result;
    


二 、更新
1、XML
<update id="updateBatchs"  parameterType="java.util.List">  	
		    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
		       	UPDATE 
		       		<include refid="table_name" />   
		       	<set>	
			        <if test="item.aa != null"><![CDATA[aa= #{item.aa},]]></if>
				</set>	
				<![CDATA[WHERE id = #{item.id}]]>
		    </foreach>  
	</update>  

2、方法体

        int result = 0;
        if (collections == null || collections.isEmpty()) {
            return result;
        }
        SqlSession batchSqlSession = null;
        try {
            // 获取批量方式的sqlsession
            batchSqlSession = getSqlSessionTemplate().getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
            String updateSqlId = getStatement("updateBatchs");
            // 每批commit的个数 > 100
            int startIndex = 0;
            int temps = IConstant.BATH_QUERY_SIZE;
            int size = collections.size();
            int count = (size % temps == 0) ? (size / temps) : (size / temps) + 1;
            boolean tag = false;
            for (int i = 0; i < count; i++) {
                if (tag) {
                    break;
                }
                if (temps > size) {
                    temps = size;
                    tag = true;
                }
                List<T> tempLists = collections.subList(startIndex, temps);
               batchSqlSession.update(updateSqlId, tempLists);
                result += tempLists.size();
                startIndex = temps;
                temps += 100;
                batchSqlSession.commit();
                batchSqlSession.clearCache();
            }
        } catch (Exception e) {
            e.printStackTrace();            
            result = 0;
            batchSqlSession.rollback();
        } finally {
            batchSqlSession.close();
        }
        return result;
    
分享到:
评论

相关推荐

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法可以批量插入时间价格表数据,但是需要注意其缺陷和限制。在实际应用中,需要根据实际情况选择合适的方法。 知识点总结: 1. Mybatis批量foreach merge into的用法可以批量...

    mybatis 批量插入返回主键

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

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

    Mybatis Plus 提供了 `batchInsert()` 和 `batchUpdate()` 方法来实现批量插入和更新。这些方法接受一个实体对象列表,然后一次性将所有对象插入或更新到数据库。然而,当涉及到唯一索引时,简单的批量操作可能无法...

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

    Mybatis批量更新三种方式的实现 Mybatis是一款流行的持久层框架,它提供了强大的数据库交互能力。其中,批量更新是一种常见...Mybatis批量更新三种方式的实现都有其优缺点,选择哪种方式取决于具体的业务场景和需求。

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

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

    MyBatis防止批量更新1

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

    mybatis学习之路mysql批量新增数据的方法

    在本文中,我们将详细介绍MyBatis批量新增数据的方法,并对比单条insert和批量insert的效率。 一、单条insert语句 mysql的insert语句是最基本的插入数据的方法,语法如下: ```sql insert into 表名(字段,字段。...

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

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

    Mybatis批量更新报错问题

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

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

    综上所述,这个Demo提供了从SpringBoot应用到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-Plus批量更新优化技巧与案例分析.zip

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

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

    对于更新和删除操作,也可以通过`&lt;update&gt;`标签内的`&lt;foreach&gt;`来批量处理。 6. **动态SQL**:MyBatis的另一大特色是动态SQL,你可以根据条件动态构建SQL语句。比如,通过`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`...

    Mybatis批量插入数据返回主键的实现

    Mybatis批量插入数据返回主键的实现 Mybatis是当前最流行的持久层框架之一,它提供了强大的批量插入功能,但是在批量插入数据时如何返回主键是一个常见的问题本文将详细介绍Mybatis批量插入数据返回主键的实现。 ...

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

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

    Mybatis 3+Mysql 实现批量插入

    本文将深入探讨如何利用MyBatis框架结合MySQL数据库实现批量插入功能,包括其原理、配置、代码实现以及优化策略。 ### 一、MyBatis框架简介 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级...

    mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    这里我们将详细探讨如何在Oracle和MySQL数据库中使用MyBatis进行批量更新。 1. **Oracle数据库的批量更新** Oracle数据库的批量更新在MyBatis中通过`&lt;foreach&gt;`标签实现。以下是一个示例: ```xml ;" separator...

    Mybatis批量插入更新xml方式和注解方式的方法实例

    Mybatis批量插入更新xml方式和注解方式的方法实例 Mybatis是一款流行的持久层框架,它提供了多种方式来实现批量插入和更新操作。今天,我们将介绍Mybatis批量插入更新xml方式和注解方式的方法实例。 Mybatis批量...

    mybatis 批量插入 嵌套select.pdf

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

Global site tag (gtag.js) - Google Analytics