首页 > 其他分享 >mybatisplus 数据批量插入 遇到错误该批次改为单条插入

mybatisplus 数据批量插入 遇到错误该批次改为单条插入

时间:2024-02-02 19:00:38浏览次数:27  
标签:return saveBatch 插入 mybatisplus 单条 public ycTestT

批量插入效率远大于单条数据插入,有事一批数据中有一条数据报错就会导致这一批次数据都插入失败,为了保证数据最大化的插入到数据库中,就需要批量转单条插入,单条插入中遇到错的数据跳过,保证其他数据正确的插入到数据库中。

直接上代码

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

相关文章

  • SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
    开发目的: 提高百万级数据插入效率。采取方案: 利用ThreadPoolTaskExecutor多线程批量插入。采用技术: springboot2.1.1+mybatisPlus3.0.6+swagger2.5.0+Lombok1.18.4+postgresql+ThreadPoolTaskExecutor等。application-dev.properties添加线程池配置信息#异步线程配置#配置核......
  • SQL PARTITION BY 语句把一张表分组后的最大值或最小值插入另一张表里
    1.例子见前一章,目的是有分组的,只显示OrderAmount最高的(即每组只显示一列) 2.再建一个表来存储CREATETABLE[dbo].[MaxOrders]([orderid][int]NULL,[Orderdate][date]NULL,[CustomerName][varchar](100)NULL,[Customercity][varchar](100)NULL,......
  • 二进制插入排序
    """要运行文档测试,请执行以下命令:python-mdoctest-vbinary_insertion_sort.py或python3-mdoctest-vbinary_insertion_sort.py要进行手动测试,请运行:pythonbinary_insertion_sort.py"""defbinary_insertion_sort(collection:list)->list:......
  • springboot整合mybatisplus
    1、引入依赖<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency&g......
  • [office] excel2013中怎样插入联机图-
    excel2013插入联机图教程:1、启动excel2013,单击插入“插图”联机图片。2、弹出一个插入图片界面,点击office剪切画。3、输入要搜索的关键字,单击放大镜按钮,搜索完毕看到结果。4、选择一张,双击即可插入到excel2013中去了。以上就是excel2013插......
  • mybatisPlus获取保存对象的id
    有个需求就是使用mybatisplus的时候,主键通过雪花算法生成,不是使用mysql数据库主键自增的,我要获取生成的id。 @TableId(type=IdType.ASSIGN_ID)@Schema(description="主键id")privateStringcenterId;使用mybatisplus的save方法便可获取 记录遇到的问题解决方法,......
  • C++实现直接插入排序、冒泡排序、快速排序、选择排序(含调试程序)
    #include<iostream>#include<fstream>#include<string>#include<vector>#include<algorithm>usingnamespace::std;classSolution{public: //直接插入排序 voidinsertsort(vector<int>&num){ for(inti=1;i<num......
  • 线程分批处理数据及MyBatis的批量插入
    文章目录一、背景二、代码实现:三、分页查询下游批次处理场景四、MyBatis的批量插入1、活动表简单表结构:2、业务层组装数据:一、背景数据量较多时,我们常常遇到需要分批处理的情况,比如上千上万数据需要需要操作数据库时(入库或者更新),我们想到分批处理,或者解析文件数据量较多,我......
  • [word] word中插入图片显示不完全、不能任意移动的解决方法
     word中插入图片显示不全:是因为输入了文字,在插入图片的位置,段落设置为固定,例如行间距设置为固定值,导致图片不能显示完整解决方法:选中图片或者图片所在行,点击段落,选择单倍行距,图片显示完整。图片无法任意拖动图片解决方法:选中图片右键->自动换行->选择四周型。......
  • [office] excel2007表格中如何插入和修改艺术字
    Excel为用户提供了多种艺术字效果,在编辑、制作表格的过程中,为了使表格中的内容更加美观,可以插入艺术字,今天我们就来学习excel2007表格中插入和修改艺术字的方法。一、插入艺术字1、切换到【插入】菜单选项卡,单击【文本】选项组中的【艺术字】下拉按钮。2、在弹出的下拉......