有时候我们会遇到,用户在前端界面提交一批数据,而这一批数据中,可能有新增的数据也可能存在修改的数据,为了方便同时执行新增和修改的方法,需要调用后端一个接口去完成,我个人的大致思路为:
// 请求后台接口
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的批量插入和批量修改的博文。欢迎友友们的意见建议。