springboot实现同时批量新增和批量修改数据

在springboot项目中,实现同时将一批数据进行新增和修改

有时候我们会遇到,用户在前端界面提交一批数据,而这一批数据中,可能有新增的数据也可能存在修改的数据,为了方便同时执行新增和修改的方法,需要调用后端一个接口去完成,我个人的大致思路为:

  1. 在前端触发提交按钮后,将数据组合为json数组,例如定义一个var attr=[],数组attr中的数据格式我们组合成为attr=[{“id”:“123”,“value”:“你好呀”},{“id”:"",“value”:“大家好”}]的格式,我们可以看到这两条数据里第二条的id是没有的,说明是新增的数据,第一条有id的为需要修改的数据。
  2. 使用ajax或者其他调用后台接口的方式,将组合好的数据转换为json字符串,可以使用JSON.stringify(attr)进行转换。
  3. 后端接收前端传来的数据,转换为我们想要的实体集合或者其他类型。
  4. 将转换的结果数据进行整理,调用对应的批量新增或批量修改的方法。
    我个人使用的具体方法实现代码如下:
    1、前端请求的代码:
	// 请求后台接口
    function requestApi() {
        // 组合数据
        let attr = [
            {id: '123',value: '你好呀'},
            {id: '456',value: '友友们'},
            {id: '',value: '新来的友友们'},
            {id: '000',value: '进我主页~'},
            {id: '',value: '大家好'},
            {id: '789',value: '关注分享更多内容呦~'},
        ];
        // 请求接口
        $.ajax({
            url:'/test/api/batchData',
            method:'POST',
            data:{
                attrList: JSON.stringify(attr)
            },
            success:function (res) {
                // 返回结果
                alert('返回结果'+res);
            }
        })
    }

2、后端控制层代码:

	/**
	 * 批量保存数据
	 */
	@PostMapping(value = "batchData")
	@ResponseBody
	public String batchData(String attrList) {
		List<Test> list = JSON.parseArray(attrList, Test.class);
		testService.batchData(list);
		return "保存成功";
	}

3、后端业务逻辑代码:

	/**
	 * 批量保存数据的具体业务逻辑方法
	 */
	public void batchData(List<Test> list) {
		// 分别定义新增和更新的实体集合
		List<Test> insertData = new ArrayList<>();
		List<Test> updateData = new ArrayList<>();
		// 将新增和更新的数据分别添加到对应的集合中
		for(Test data:list){
			if(StringUtils.isEmpty(data.getId())){
				insertData.add(data);
			}
			if(!StringUtils.isEmpty(data.getId())){
				updateData.add(data);
			}
		}
		// 判断集合是否有数据,避免不必要的执行
		if(insertData.size()>0){
			dao.insertBatch(insertData); // 调用批量新增执行的SQL语句
		}
		if(updateData.size()>0){
			dao.updateBatch(updateData); // 调用批量修改执行的SQL语句
		}
	}

这是我个人的方法,肯定还有其他更快捷,性能更好的实现方法,优化空间很大,具体dao调用的批量插入或者批量修改的SQL,可根据自身的需求编写,或可进入我的主页,查看关于mybatis的批量插入和批量修改的博文。欢迎友友们的意见建议。

### Spring Boot 后端批量插入数据实现方法 在处理大量数据时,批处理操作可以显著提高性能并减少数据库连接次数。对于Spring Boot应用程序而言,可以通过JPA或原生SQL语句来执行高效的批量插入。 #### 使用 JPA 实现批量插入 为了利用JPA进行批量保存实体对象,在配置文件中设置`spring.jpa.properties.hibernate.jdbc.batch_size=50`以启用Hibernate的批量更新功能[^1]: ```properties spring.jpa.properties.hibernate.jdbc.batch_size=50 ``` 定义一个简单的Entity类用于演示目的: ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // Getters and Setters... } ``` 创建Repository接口继承自`CrudRepository<User,Long>`或者更具体的`JpaRepository<User,Long>`以便访问持久化层的功能: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> {} ``` 编写Service组件负责业务逻辑以及调用存储库中的saveAll()函数完成多条记录的同时写入动作: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public void saveUsers(List<User> users){ userRepository.saveAll(users); } } ``` 如果希望进一步优化性能,则可以在事务管理器的作用域内手动控制flush行为从而避免过多不必要的I/O请求发送给DBMS服务器: ```java @Transactional public void bulkSaveWithFlushControl(){ List<User> userList = generateUserList(); int batchSize = 50; for (int i = 0; i < userList.size(); i++) { userRepo.save(userList.get(i)); if ((i + 1) % batchSize == 0 ) { // Flush a batch of inserts and release memory. entityManager.flush(); entityManager.clear(); } } } ``` #### 使用 Native SQL 执行高效大批量加载 当面对非常庞大的数据集时,考虑采用直接向目标表提交INSERT INTO ... VALUES(...)形式的命令字符串可能更加合适;这种方式绕过了ORM框架带来的额外开销并且允许开发者灵活调整参数绑定机制。 通过声明式方式指定查询模板,并借助于`@Modifying`注解表明这是一个修改型的操作而非只读式的检索过程: ```java public interface BatchInsertRepository extends CrudRepository<User, Long> { @Transactional @Modifying(flushAutomatically = true, clearAutomatically=true) @Query(value="INSERT INTO USER(NAME) VALUES(?1)", nativeQuery = true) void insertBatch(String... names); } ``` 上述例子展示了如何接受可变数量的名字作为输入并通过占位符?N的形式传递到预编译后的SQL表达式里去填充实际值的位置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒜鸟小窝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值