mybatis批量新增数据

数据量大的时候如果在循环中执行单条新增操作,是非常慢的。那么如何在mybatis中实现批量新增数据呢?

方法

insert 标签的 foreach 属性可以用于批量插入数据。您可以使用 foreach 属性遍历一个集合,并为集合中的每个元素生成一条插入语句。

<insert id="insertBatch" parameterType="list">
  insert into table_name (column1, column2)
  values
  <foreach collection="list" item="item" separator=",">
    (#{item.column1}, #{item.column2})
  </foreach>
</insert>

实战

表结构

我有一张表结构如下,为了好理解我把结构做了适当的精简:

create table exa_paper_question
(
    paper_id       bigint          not null comment '试卷编号',
    question_id    bigint          not null comment '试题编号'
)
    comment '试卷和试题关联表';

实体

public class ExaPaperQuestion
{
    private static final long serialVersionUID = 1L;
    /** 试卷编号 */
    private Long paperId;
    /** 试题编号 */
    private Long questionId;
    // getter setter 略
 }

maper.java

 /**
     * 批量新增试卷与试题的关系
     *
     * @param list 试卷和试题关联集合
     */
    public int batchAddQuestionToPage(List<ExaPaperQuestion> list);

mapper.xml

  <!--批量新增试卷与试题的关系 -->
    <insert id="batchAddQuestionToPage" parameterType="list">
        insert into exa_paper_question (paper_id, question_id)
        values
        <foreach collection="list" item="item" separator=",">
            (#{item.paperId}, #{item.questionId})
        </foreach>
    </insert>

业务调用处示例

 List<ExaPaperQuestion> list = new ArrayList<>();
for(Long id:questionIds){
      ExaPaperQuestion pq = new ExaPaperQuestion();
      pq.setPaperId(request.getPaperId());
      pq.setQuestionId(id);
      list.add(pq);
  }

  exaPaperQuestionMapper.batchAddQuestionToPage(list);

批量删除

上面是演示的批量新增,那就也能用到批量删除。

如果是有主键的表,批量删除格式如下:

  <delete id="deleteExaQuestionByQuestionIds" parameterType="String">
        delete from exa_question where question_id in
        <foreach item="questionId" collection="array" open="(" separator="," close=")">
            #{questionId}
        </foreach>
    </delete>

如果是我示例中的这张表,是需要两个条件确实一条记录的,那么就这样写:

   <!--批量删除试卷与试题的关系 -->
    <insert id="batchDeleteExaPaperQuestionByPaperId" parameterType="list">
        delete from exa_paper_question
        where (paper_id, question_id) in (
        <foreach collection="list" item="item" separator=",">
            (#{item.paperId}, #{item.questionId})
        </foreach>
        )
    </insert>

其他的代码参考批量新增,几乎一致不在占用版面。

总结

稍作修改性能提升几十倍,非常的爽

相关推荐

  1. mybatis批量新增数据

    2024-04-03 14:26:02       13 阅读
  2. mybatis 批量添加数据

    2024-04-03 14:26:02       8 阅读
  3. MybatisPlus大量数据批量新增优化

    2024-04-03 14:26:02       26 阅读
  4. springboot实现同时批量新增批量修改数据

    2024-04-03 14:26:02       16 阅读
  5. Mybatis新增某个数据后,如何获取新增数据的id

    2024-04-03 14:26:02       38 阅读
  6. linux批量新增用户、linux批量删除用户

    2024-04-03 14:26:02       31 阅读
  7. Mybatis批量增删改查

    2024-04-03 14:26:02       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 14:26:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 14:26:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 14:26:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 14:26:02       18 阅读

热门阅读

  1. 最大子数组问题

    2024-04-03 14:26:02       18 阅读
  2. 洛谷 P8772 [蓝桥杯 2022 省 A] 求和

    2024-04-03 14:26:02       13 阅读
  3. audio_video_img图片音视频异步可视化加载

    2024-04-03 14:26:02       13 阅读
  4. 2024年3月调研学习文档资料汇总

    2024-04-03 14:26:02       12 阅读
  5. Vulkan Material 设计学习

    2024-04-03 14:26:02       14 阅读
  6. 自然语言处理(NLP):揭秘AI领域的“语言大师

    2024-04-03 14:26:02       15 阅读
  7. 如何搭建一个免费的源代码托管工具?

    2024-04-03 14:26:02       12 阅读
  8. python - 实现一个通用的插件类

    2024-04-03 14:26:02       12 阅读
  9. Matlab未装工具箱

    2024-04-03 14:26:02       16 阅读