mybatisplus 数据批量插入 遇到错误该批次改为单条插入
批量插入效率远大于单条数据插入,有事一批数据中有一条数据报错就会导致这一批次数据都插入失败,为了保证数据最大化的插入到数据库中,就需要批量转单条插入,单条插入中遇到错的数据跳过,保证其他数据正确的插入到数据库中。
直接上代码
1、实体类
@TableName(value = "yc_test_t")
public class YcTestT {
private static final long serialVersionUID = 1L;
/**
* ID。
*/
@TableId
private Integer id;
/**
* 姓名。
*/
private String name;
/**
* 备注。
*/
private String note;
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setNote(String note) {
this.note = note;
}
public String getNote() {
return note;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("name", getName())
.append("note", getNote())
.toString();
}
}
2、mapper类
public interface YcTestTMapper extends BaseMapper<YcTestT> {
}
3、接口类 如下红色部分
重点:必须继承IService
public interface IYcTestTService extends IService<YcTestT> {
/**
* 批量插入测试表。
*
* @param entityList 参数说明
* @return status
*/
boolean saveBatch(Collection<YcTestT> entityList);
/**
* 单记录新增测试表。
*
* @param ycTestT 参数说明
* @return status
*/
int insert(YcTestT ycTestT);
}
4、实现类
重点:如下红色部分继承ServiceImpl类 复写saveBatch方法
@Service public class YcTestTServiceImpl extends ServiceImpl<YcTestTMapper, YcTestT> implements IYcTestTService { @Autowired YcTestTMapper ycTestTMapper; @Override @Transactional public boolean saveBatch(Collection<YcTestT> entityList) { return super.saveBatch(entityList); } /** * 单记录新增测试表。 * * @param ycTestT 参数说明 * @return status */ @Override public int insert(YcTestT ycTestT) { return ycTestTMapper.insert(ycTestT); } }
5、 控制器
重点:红色部分是批量转单条插入的关键
@RestController
@RequestMapping("/yctestt")
public class YcTestTController extends BaseController {
@Autowired
private IYcTestTService ycTestTService;
/**
* 单记录新增测试表。
*
* @return AjaxResult
*/
@PostMapping(value = "/saveBatch", headers = API_VERSION_NAME + "=v1")
@ResponseBody
public AjaxResult saveBatch() {
List<YcTestT> list = new ArrayList<>();
for(int i = 0 ;i < 5000;i++){
YcTestT ycTestT = new YcTestT();
ycTestT.setId(i);
ycTestT.setName("张三"+(i+""));
ycTestT.setNote("备注"+(i+""));
list.add(ycTestT);
if ( (i+1)%3000 == 0) {
try {
//打开注释主动抛出异常,会进入单条插入的处理流程中
//throw new Exception("自定义异常信息");
ycTestTService.saveBatch(list);
} catch (Exception e) {
// 批量插入失败,改为单条插入
for (int j = 0; j<list.size();j++) {
try {
YcTestT testT = list.get(j);
//单条插入
ycTestTService.insert(testT);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}finally {
list.clear();
}
}
}
//处理除3000余数的数据
if(list.size()>=1){
ycTestTService.saveBatch(list);
}
return AjaxResult.success(HttpStatusCode.POST_SUCCESS_CODE,"success!");
}
}
浙公网安备 33010602011771号