java批量提交_MyBatis通过BATCH批量提交的方法

很多人在用 MyBatis 或者 通用 Mapper 时,经常会问有没有批量插入和批量更新的方法。

实际上许多时候没必要用去实现特别复杂的批量操作。直接通过 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 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 执行顺序。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Mybatis和MySQL批量插入和批量更新,可以使用以下方法: 1. 批量插入 使用MyBatis的foreach标签,可以很方便地实现批量插入操作。示例如下: ```xml <insert id="batchInsert" parameterType="java.util.List"> insert into my_table (col1, col2, col3) values <foreach collection="list" item="item" separator=","> (#{item.col1}, #{item.col2}, #{item.col3}) </foreach> </insert> ``` 其,parameterType指定参数类型为List,collection属性指定要插入的List对象,item指定List的元素,separator指定分隔符。 在Java代码,调用该方法时,将List对象作为参数传入即可。 2. 批量更新 对于批量更新,可以使用MySQL的replace into语句来实现。示例如下: ```xml <update id="batchUpdate" parameterType="java.util.List"> <foreach collection="list" item="item" separator=";"> replace into my_table (id, col1, col2, col3) values (#{item.id}, #{item.col1}, #{item.col2}, #{item.col3}) </foreach> </update> ``` 其,replace into语句会先尝试插入记录,如果记录已存在,则更新记录。参数类型和调用方式与批量插入相同。 3. 存在即更新 如果只想更新已存在的记录,可以使用MySQL的on duplicate key update语句。示例如下: ```xml <update id="updateIfExists" parameterType="com.example.MyEntity"> insert into my_table (id, col1, col2, col3) values (#{id}, #{col1}, #{col2}, #{col3}) on duplicate key update col1 = values(col1), col2 = values(col2), col3 = values(col3) </update> ``` 其,id字段为主键。如果该记录已存在,则更新col1、col2、col3字段;否则插入新记录。参数类型为MyEntity,调用方式为传入一个MyEntity对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值