批处理,mybatis有2中方式
1 foreach
2 batch
分析下batch存在的问题
SqlSession session = sqlSessionTemplate.getSqlSessionFactory()
.openSession(ExecutorType.BATCH, false);
InspectTemplateMapper inspectTemplateMapper = session.getMapper(InspectTemplateMapper.class);
//设置每次提交的数量
int size = insertList.size();
int count =0 ;
//这里要多线程处理(4个线程的线程池)
try {
for (int i = 0; i < size; i++) {
inspectTemplateMapper.insertSelective(insertList.get(i));
count++;
if (i % 1000 == 0 ) {
// 手动每1000个一提交,提交后无法回滚
session.commit();
// 清理缓存,防止溢出
session.clearCache();
}
}
} catch (Exception e) {
// 没有提交的数据可以回滚
session.rollback();
} finally {
session.close();
}
return count;
这里我用的自增主键,每次事物提交,会报出java.sql.BatchUpdateException: Field 'device_id'(主键) doesn't have a default value
查询了很多资料,有人说batch批处理只有最后一条会有自增主键,或者说mysql自增主键只有在一个事物提交时,会产生一个(个人猜想)
亲测:
批处理list只有一条数据时传入
仍然报错,否定了之前的猜想,batch不会返回自增主键
如果想要批处理还要用自增主键,在xml用foreach 设置 useGeneratedKeys="true" keyProperty="id" 即可