批量插入效率远大于单条数据插入,有事一批数据中有一条数据报错就会导致这一批次数据都插入失败,为了保证数据最大化的插入到数据库中,就需要批量转单条插入,单条插入中遇到错的数据跳过,保证其他数据正确的插入到数据库中。
直接上代码
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!"); } }
标签:return,saveBatch,插入,mybatisplus,单条,public,ycTestT From: https://www.cnblogs.com/yclh/p/18003684