【SpringBoot DB系列】Jooq批量写入采坑记录

前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入…,这就有点尬了

1. 三种插入姿势

关于项目创建以及jooq的相关使用姿势,推荐查看之前的博文: 【DB系列】Jooq之新增记录使用姿势

下面是我们采用的三种批量插入方式

/*** 通过Record执行批量添加** 通过源码查看,这种插入方式实际上是单条单条的写入数据,和下面的一次插入多条有本质区别** @param list* @return*/
public boolean batchSave(List<PoetBO> list) {List<PoetPO> poList = list.stream().map(this::bo2po).collect(Collectors.toList());int[] ans = dsl.batchInsert(poList).execute();System.out.println(JSON.toJSONString(ans));return true;
}/*** 类sql写法,批量添加** @param list* @return*/
public boolean batchSave2(List<PoetBO> list) {InsertValuesStep2<PoetPO, Integer, String> step = dsl.insertInto(table).columns(table.ID, table.NAME);for (PoetBO bo : list) {step.values(bo.getId(), bo.getName());}return step.execute() > 0;
}/*** 不基于自动生成的代码,来批量添加数据** @param list* @return*/
public boolean batchSave3(List<PoetBO> list) {InsertQuery insertQuery = dsl.insertQuery(DSL.table("poet"));for (PoetBO bo : list) {insertQuery.addValue(DSL.field("id", Integer.class), bo.getId());insertQuery.addValue(DSL.field("name", String.class), bo.getName());insertQuery.newRecord();}return insertQuery.execute() > 0;
}

请注意上面的三种批量插入方式,基本上对应的就是jooq的三种常见的用法

  • 直接借助自动生成的Record类来操作
  • 类sql的拼接写法,基本上我们平时的sql怎么写,这里就怎么用
  • InsertQuery:借助jooq提供的各种Query类来执行目标操作

2. 日志验证

上面三种写法中,第一种批量插入方式,并不是我们传统理解的一次插入多条记录,相反它是一条一条的插入的,我们可以通过开启jooq的日志来查看一些执行的sql情况

配置文件 application.properties,添加下面的配置

debug=false
trace=false
logging.level.org.jooq=DEBUG

如果有自己的logback.xml配置文件,可以调整一下日志级别,将jooq的debug日志放出来

一个简单的测试case

public void test() {this.batchSave(Arrays.asList(new PoetBO(14, "yh"), new PoetBO(15, "yhh")));this.batchSave2(Arrays.asList(new PoetBO(16, "yihui"), new PoetBO(17, "yihuihui")));this.batchSave3(Arrays.asList(new PoetBO(18, "YiHui"), new PoetBO(19, "YiHuiBlog")));
}

从上面的sql来看,后面两个确实是一次插入多条,但是第一个,也没有将具体执行的sql打印出来,所有不看源码的话,也没有办法实锤是一条一条插入的

为了验证这个问题,一个简单的解决办法就是批量插入两条数据,第一条正常,第二条异常,如果第一条插入成功,第二条失败那就大概率是单个插入的了

// 表结构中,name的字段最大为20,下面插入的第二条数据长度超限
try {this.batchSave(Arrays.asList(new PoetBO(14, "yh"), new PoetBO(15, "1234567890098765432112345")));
} catch (Exception e) {e.printStackTrace();
}try {this.batchSave2(Arrays.asList(new PoetBO(16, "yihui"), new PoetBO(17, "1234567890098765432112345")));
} catch (Exception e) {e.printStackTrace();
}
this.batchSave3(Arrays.asList(new PoetBO(18, "YiHui"), new PoetBO(19, "YiHuiBlog")));

第一种批量插入失败

第二种插入失败

插入后结果

请注意上面的报错,以及最终插入的结果,第一种插入方式一个插入成功一个失败;第二种批量插入方式,两条都插入失败;

通常情况下,一次插入多条数据时,一个插入失败,会导致整个插入都失败,如下

3. 源码分析

上面是从日志以及结果表现来推测实际的执行情况,接下来就需要从源码角度来看一下,是否真的是单个的执行了

省略掉具体的定位过程,直接找到org.jooq.impl.BatchCRUD#execute,对应的代码

@Override
public final int[] execute() throws DataAccessException {// [#1180] Run batch queries with BatchMultiple, if no bind variables// should be used...if (executeStaticStatements(configuration.settings())) {return executeStatic();}else {return executePrepared();}
}

上面有两种插入方式,对于插入的核心逻辑一样

遍历集合,获取单个 record,执行 CURD

II. 其他

0. 项目

系列博文

  • 【SpringBoot DB系列】Jooq之记录更新与删除
  • 【SpringBoot DB系列】Jooq之新增记录使用姿势
  • 【SpringBoot DB系列】Jooq代码自动生成
  • 【SpringBoot DB系列】Jooq初体验

项目源码

  • 工程:https://github.com/liuyueyi/spring-boot-demo
  • 项目源码: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/108-jooq-curd

1. 一灰灰Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

  • 一灰灰Blog个人博客 https://blog.hhui.top
  • 一灰灰Blog-Spring专题博客 http://spring.hhui.top

【SpringBoot DB系列】Jooq批量写入采坑记录相关推荐

  1. spring boot 高性能批量新增_「SpringBoot DB系列」Jooq之新增记录使用姿势

    [SpringBoot DB 系列]Jooq 之新增记录使用姿势 接下来我们开始进入 jooq 的增删改查的使用姿势系列,本篇将主要介绍如何利用 jooq 来实现添加数据 I. 项目搭建 本项目借助S ...

  2. redis 经纬度_【SpringBoot DB 系列】Redis 高级特性之 GEO

    [SpringBoot DB 系列]Redis 高级特性之 GEO GEO 用于存储地理信息,最直观的就是我们日常使用的地图 app 中,如果我想查询我所在地的周边餐饮,就可以利用 geo 中的以(x ...

  3. springboot mybatisplus 多数据源_【SpringBoot DB 系列】MybatisPlus 多数据源配置

    [SpringBoot DB 系列]Mybatis-Plus 多数据源配置 前面介绍了两种 Mybatis 的数据源配置,当然也少不了 mybatis-plus MyBatis-Plus (opens ...

  4. Linux MySQL数据库冷迁移采坑记录

    Linux MySQL数据库冷迁移采坑记录 当前文件系统已满,需要将MySQL默认路径迁移到新文件系统下. MySQL数据库文件原位置:/var/lib/mysql . 要移动至:/mysql/mys ...

  5. IDEA配置使用mvnd打包的采坑记录(无废话版)

    IDEA配置使用mvnd打包的采坑记录(无废话版) 此处不赘述mvnd的作用了,比maven打包快很多 可参考 https://blog.csdn.net/m4330187/article/detai ...

  6. iOS 微信SDK1.8.6后需要UniversalLink解决方案及采坑记录

    项目最初因审核原因,一直使用iOS原生分享, 最近因项目需求要求, 接入微信分享, 以为和原来的没有区别, 但是接入时才发现改动的地方还是挺多的, 主要是需要配置UniversalLink和提包时的一 ...

  7. H5拍照、预览、压缩、上传采坑记录

    H5拍照.预览.压缩.上传采坑记录 公司项目前段时间需要实现手机拍照上传的功能,本来以为用createObjectURL和canvas可以很轻松的实现,结果发现问题多多,特此记录下来. DEMO预览( ...

  8. mysql8.0.19.0_分享MySql8.0.19 安装采坑记录

    上篇文章给大家介绍了MySql8.0.19 安装过程,需要的朋友可以点击查看.https://www.jb51.net/article/178988.htm 1.ERROR 1820 (HY000): ...

  9. mysql8.0依赖_分享MySql8.0.19 安装采坑记录

    上篇文章给大家介绍了MySql8.0.19 安装过程,需要的朋友可以点击查看.https://www.jb51.net/article/178988.htm 1.ERROR 1820 (HY000): ...

最新文章

  1. JavaWeb核心编程之Tomcat安装和配置
  2. ffmpeg实现摄像头拉流_[FFmpeg] 如何通过实时摄像头帧图片生成 rtmp 直播流?
  3. 1Ubuntu下ftp服务器搭建
  4. 内部导线拉力测试_端子拉脱力的正确测试方法及标准
  5. LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)
  6. IIS Express URL Rewrite无效
  7. 【Centos】【Python】【Flask】阿里云上部署一个 flask 项目
  8. process.nextTick
  9. 医院绩效考核管理平台建设方案
  10. java poi 读合并单元格的内容,poi合并单元格,poi合并单元格并设置内容居中
  11. VLAN隔离技术 — 端口隔离
  12. radio单选框操作
  13. 想杀死某个端口进程,但在服务列表中却找不到,可以之间通过命令行找到这个进程并杀死该进程,减少重启电脑和找到问题根源。
  14. 射频电路学习之LC振荡电路
  15. 【打卡-Coggle竞赛学习2023年3月】对话意图识别
  16. mysql: load data与select into outfile
  17. smart gesture安装失败_从安装到打印HP 108w操作详解
  18. oracle如何恢复表中删除的数据?
  19. Topy Desk Privacy Policy
  20. 200用户的oa文件服务器配置,oa服务器主要配置

热门文章

  1. 安装增强功能时出错:未能加载虚拟光驱 VBoxsGuestAdditions.iso到虚拟电脑
  2. KY-RTI分布仿真技术:第九章 综合演示
  3. Codeforces--44A--Indian Summer
  4. 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)
  5. 华为交换机配置接口安全
  6. 【ACM】2022.7.31训练赛
  7. Oracle 利用 UTL_SMTP 包发送邮件
  8. 2022G2电站锅炉司炉考试题及在线模拟考试
  9. 软考 - 09 预约挂号管理系统
  10. 自定义类型的深度剖析