很多人在用 MyBatis 或者 通用 Mapper 时,经常会问有没有批量插入和批量更新的方法。
实际上许多时候没必要用<foreach> 去实现特别复杂的批量操作。直接通过 MyBatis 的 BATCH 方式执行增删改方法即可。
下面是一个批量用法的例子:
@Autowired private SqlSessionFactory sqlSessionFactory; @Transactional(rollbackFor = Exception.class) @Override public void batchTest() { SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); CountryMapper mapper = sqlSession.getMapper(CountryMapper.class); List<Country> countries = mapper.selectAll(); for (int i = 0; i < countries.size(); i++) { Country country = countries.get(i); country.setCountryname(country.getCountryname() + "Test"); mapper.updateByPrimaryKey(country); //每 50 条提交一次 if((i + 1) % 50 == 0){ sqlSession.flushStatements(); } } sqlSession.flushStatements(); }
在上面例子中,在Service中直接注入了SqlSessionFactory,通过下面方法获取了一个可以批量提交的SqlSession:
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
后续通过SqlSession直接执行方法,或者获取的Mapper接口,都使用的批量提交方式。
上述代码执行过程中输出的日志如下:
DEBUG - Creating new transaction with name [com.isea533.mybatis.service.impl.CountryServiceImpl.batchTest]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
DEBUG - Acquired Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@752c11a2] for JDBC transaction
DEBUG - Switching JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@752c11a2] to manual commit
DEBUG - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@752c11a2] will be managed by Spring
DEBUG - ==> Preparing: SELECT Id,countryname,countrycode FROM country
DEBUG - ==> Parameters:
DEBUG - <== Total: 183
DEBUG - ==> Preparing: UPDATE country SET Id = Id,countryname = ?,countrycode = ? WHERE Id = ?
DEBUG - ==> Parameters: AngolaTest(String), AO(String), 1(Integer)
DEBUG - ==> Parameters: AfghanistanTest(String), AF(String), 2(Integer)
DEBUG - ==> Parameters: AlbaniaTest(String), AL(String), 3(Integer)
==========================================
...省略中间部分参数
==========================================
DEBUG - ==> Parameters: EthiopiaTest(String), ET(String), 50(Integer)
DEBUG - ==> Preparing: UPDATE country SET Id = Id,countryname = ?,countrycode = ? WHERE Id = ?
DEBUG - ==> Parameters: FijiTest(String), FJ(String), 51(Integer)
DEBUG - ==> Parameters: FinlandTest(String), FI(String), 52(Integer)
==========================================
...省略中间部分参数
==========================================
DEBUG - ==> Parameters: MadagascarTest(String), MG(String), 98(Integer)
DEBUG - ==> Parameters: MalawiTest(String), MW(String), 99(Integer)
DEBUG - ==> Parameters: MalaysiaTest(String), MY(String), 100(Integer)
DEBUG - ==> Preparing: UPDATE country SET Id = Id,countryname = ?,countrycode = ? WHERE Id = ?
DEBUG - ==> Parameters: MaldivesTest(String), MV(String), 101(Integer)
DEBUG - ==> Parameters: MaliTest(String), ML(String), 102(Integer)
==========================================
...省略中间部分参数
==========================================
DEBUG - ==> Parameters: South AfricaTest(String), ZA(String), 149(Integer)
DEBUG - ==> Parameters: SpainTest(String), ES(String), 150(Integer)
DEBUG - ==> Preparing: UPDATE country SET Id = Id,countryname = ?,countrycode = ? WHERE Id = ?
DEBUG - ==> Parameters: Sri LankaTest(String), LK(String), 151(Integer)
DEBUG - ==> Parameters: St.LuciaTest(String), LC(String), 152(Integer)
==========================================
...省略中间部分参数
==========================================
DEBUG - ==> Parameters: ZaireTest(String), ZR(String), 182(Integer)
DEBUG - ==> Parameters: ZambiaTest(String), ZM(String), 183(Integer)
==========================================
下面事务自动提交
==========================================
DEBUG - Initiating transaction commit
DEBUG - Committing JDBC transaction on Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@752c11a2]
DEBUG - Releasing JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@752c11a2] after transaction
DEBUG - Returning JDBC Connection to DataSource
注意事项
1. 事务
由于在 Spring 集成的情况下,事务连接由 Spring 管理(SpringManagedTransaction),所以这里不需要手动关闭 sqlSession,在这里手动提交(commit)或者回滚(rollback)也是无效的。
2. 批量提交
批量提交只能应用于 insert, update, delete。
并且在批量提交使用时,如果在操作同一SQL时中间插入了其他数据库操作,就会让批量提交方式变成普通的执行方式,所以在使用批量提交时,要控制好 SQL 执行顺序。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接
本文向大家介绍jQuery通过ajax快速批量提交表单数据,包括了jQuery通过ajax快速批量提交表单数据的使用技巧和注意事项,需要的朋友参考一下 当表单数据项很多时,手动获取表单项的值将变得效率低下,结合jQuery提供的函数serialize(),我们可以实现快速获取数据并提交表单数据。 请看下面的表单: 我们可以通过自定义函数getFormData()来获取表单的数据,请看下面的例子:
列表数据是前端push的数据,接口没有,然后选择复选框打钩,点击弹框确定按钮把列表id给提交的给接口ids,状态选择了工艺分析,最后把工艺分析给列表的样品流程里,大佬们,列表没有调后台的接口情况下,点击提交按钮后怎么让页面也变成工艺分析,这怎么实现呢 目前的提交代码:
本文向大家介绍mybatis postgresql 批量删除操作方法,包括了mybatis postgresql 批量删除操作方法的使用技巧和注意事项,需要的朋友参考一下 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时
本文向大家介绍redis通过pipeline提升吞吐量的方法,包括了redis通过pipeline提升吞吐量的方法的使用技巧和注意事项,需要的朋友参考一下 案例目标 简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用。 案例背景 应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元; 然而在某些服务中,数据操作对redis 是强依
问题内容: 我正在使用两种类型的提交。 有$ .post 它将单独的变量发送到服务器端脚本。 还有一个AjaxSubmit插件可以提交整个表单 但是,现在我有以下任务,假设我有一个表单和一些必须同时提交的变量。 那么可以一起提交表单+一些变量吗? 问题答案: 更新资料 您可以通过以下方式提交: 您可以用来将数组或对象转换为URL友好的名称/值巴黎。您可能还需要使用将表单数据转换为名称- 值巴黎。这
我对SpringBoot中的Kafka批处理侦听器有问题。 这是@KafkaListener 对于我的问题,这个解决方案不起作用,因为提交批处理。对于我的解决方案,我需要提交单个消息的偏移量。 我尝试使用