使用SpringBoot和JPA实现批量处理新增、修改
2023-06-26 10:29:36
作者:procedure rabbit
最近项目需要在JPA中使用ID进行批量更新,所以下面这篇文章主要给大家介绍了关于使用SpringBoot和JPA实现批量处理新增、修改的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
jpa的sava与saveAll
save()方法
@Transactional
public <S extends T> S save(S entity) {
if (this.entityInformation.isNew(entity)) {
this.em.persist(entity);
return entity;
} else {
return this.em.merge(entity);
根据源码我们可以看出来,save是先通过判断这个对象是不是新的,新的便会新增,否则就是执行的修改。整个是有分两步进行的,先查询再新增
saveAll()方法
@Transactional
public <S extends T> List<S> saveAll(Iterable<S> entities) {
Assert.notNull(entities, "The given Iterable of entities not be null!");
List<S> result = new ArrayList();
Iterator var3 = entities.iterator();
while(var3.hasNext()) {
S entity = var3.next();
result.add(this.save(entity));
return result;
saveAll()方法是一种更新多条的一种方式,里面传的存对象的集合。分析源码我们可以看出saveAll()底层还是调用的save()方法,也就是每次需要先查询再做修改。在使用上方便,但是因每次涉及到查询、新增,事务的关系,导致修改或者新增耗时得非常的久。
那么下面我们将结合EntityManager对批量新增,修改做出优化。
jpa结合Batch
spring:
#配置 Jpa
properties:
hibernate:
generate_statistics: false
order_insert: true //配置批量新增
order_update: true //配置批量修改
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
jdbc:
batch_size: 1000 //容器内批量的大小
open-in-view: true
EntityManager
EntityManager其实就是一个容器,通过注解引入EntityManager对象 使用EntityManager对新增,修改进行批量处理
* @author 程序员panda
* @date
* @desc 批量处理
@Service
@Transactional
public class BatchService {
@PersistenceContext
private EntityManager entityManager;
//配置文件中每次批量提交的数量
@Value("${spring.jpa.properties.hibernate.jdbc.batch_size}")
private long batchSize;
* 批量插入
* @param list 实体类集合
* @param <T> 表对应的实体类
public <T> void batchInsert(List<T> list) {
if (!ObjectUtils.isEmpty(list)){
for (int i = 0; i < list.size(); i++) {
entityManager.persist(list.get(i));
if (i % batchSize == 0) {
entityManager.flush();
entityManager.clear();
entityManager.flush();
entityManager.clear();
* 批量更新
* @param list 实体类集合
* @param <T> 表对应的实体类
public <T> void batchUpdate(List<T> list) {
if (!ObjectUtils.isEmpty(list)){
for (int i = 0; i < list.size(); i++) {
entityManager.merge(list.get(i));
if (i % batchSize == 0) {
entityManager.flush();
entityManager.clear();
entityManager.flush();
entityManager.clear();
选择一个需要新增的table,将原有的saveAll(),改为调用自定义的batchInsert()方法