Mybatis和MybatisPlus批量插入

最近开发的时候遇到一个问题,需要一次插入一千多条数据怎么写?

最开始我是这么写的

public void xxxService(List<DTO> list){
  for(DTO dto : list) {
    mapper.insert(dto);
  }
}

  简化了一下,大概是这个意思,然后前端插数据等了五分钟控制台还在刷,真的难绷,笑死我了,我都在想我怎么会写出这种代码。

  之后我发现了mp继承IService有加强功能,里面就有批量插入的方法叫saveBatch()

然后我这么写

List<MtyTaskCompanyDO> list = taskCompany.stream()
        .map(s -> {
            MtyTaskCompanyDO companyDO = new MtyTaskCompanyDO();
            companyDO.setId(UUID.randomUUID().toString());
            companyDO.setCompanyId(s);
            companyDO.setTaskId(taskId);
            return companyDO;
        })
        .collect(Collectors.toList());
saveBatch(list);

  这样写我以为完美了,让前端去试,结果发现还是很慢,一直没有响应。很无奈,于是我找了找原因,我们看看源码。

default boolean saveBatch(Collection<T> entityList) {
        return this.saveBatch(entityList, 1000);
    }

  这里没什么问题,我们接着进

    public boolean saveBatch(Collection<T> entityList, int batchSize) {
        String sqlStatement = sqlStatement(SqlMethod.INSERT_ONE);
        int size = entityList.size();
        executeBatch(sqlSession -> {
            int i = 1;
            for (T entity : entityList) {
                sqlSession.insert(sqlStatement, entity);
                if ((i % batchSize == 0) || i == size) {
                    sqlSession.flushStatements();
                }
                i++;
            }
        });
        return true;
    }

  好,发现问题所在了,原来源码也在循环,真的难绷,可能相对于循环插入快一点,但也快不到哪里去,所以还得是让mybatis出马。

最后我这样写

  mp中不写xml的方式,自己拼接sql语句,这样比较原始

@Resource
JdbcTemplate template;

StringBuilder sqlFormat = new StringBuilder("inset into mty_task_company (id, taskId, companyId) values ");

for(int i = 0; i < taskCompany.size(); i++){
    sqlFormat.append("(").append(UUID.randomUUID()).append(",").append(taskId).append(",").append(taskCompany.get(i)).append(")");
    if(i != taskCompany.size()-1){
        sqlFormat.append(",");
    }
}

template.execute(sqlFormat.toString());

第二种就自己写xml咯,我推荐这种

    <!-- 批量写入 -->
    <insert id="batchInsert">
        INSERT INTO mty_task_company(
        id, task_id, company_id
        )VALUES
        <foreach collection="list" item="item" index="index" separator="," >
            (
            #{item.id},#{item.taskId},#{item.companyId}
            )
        </foreach>
    </insert>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MybatisPlus是一个基于Mybatis的增强工具库,在Mybatis的基础上加入了许多实用的增强功能,其中就包括批量插入。 通过MybatisPlus实现批量插入,可以通过以下步骤实现: 1. 创建一个List对象,用于存储要批量插入的数据。 2. 在实体类中使用注解@TableId(value = "id", type = IdType.AUTO)来指定主键生成策略。 3. 在Mapper接口中定义一个批量插入的方法,方法参数类型为List,使用注解@Param来指定参数名称。 4. 在Mapper映射文件中,使用foreach标签遍历List集合中的数据,将数据插入到数据库中。 举例来说,假设我们要批量插入学生信息,代码实现如下: 1. 创建一个List对象: List<Student> list = new ArrayList<>(); 2. 在实体类中使用注解@TableId指定主键生成策略: @TableId(value = "id", type = IdType.AUTO) public class Student { private Long id; ... } 3. 在Mapper接口中定义批量插入的方法: void insertBatch(@Param("list") List<Student> list); 4. 在Mapper映射文件中,使用foreach标签遍历List集合中的数据: <insert id="insertBatch" parameterType="java.util.List"> insert into student(id, name, age, gender) values <foreach collection="list" item="item" separator=","> (#{item.id}, #{item.name}, #{item.age},#{item.gender}) </foreach> </insert> 通过以上步骤,就可以轻松地实现MybatisPlus批量插入。值得注意的是,在使用批量插入时,需要考虑数据库中的主键是否重复,需要根据具体情况选择不同的主键生成策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值