【SpringBoot DB 系列】Jooq 之新增记录使用姿势

接下来我们开始进入 jooq 的增删改查的使用姿势系列,本篇将主要介绍如何利用 jooq 来实现添加数据

I. 项目搭建

本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发

1. 项目依赖

关于如何创建一个 SpringBoot 的项目工程,不再本文的描述范围内,如有兴趣可以到文末的个人站点获取

在这个示例工程中,我们的选用 h2dabase 作为数据库(方便有兴趣的小伙伴直接获取工程源码之后,直接测试体验),因此对应的 pom 核心依赖如下

            org.springframework.boot        spring-boot-starter-web                org.springframework.boot        spring-boot-starter-jooq                com.h2database        h2    

2. 数据库初始化

我们借助jooq-codegen-maven插件来自动生成数据库相关的代码,对这一段逻辑感兴趣的小伙伴可以参考博文:【DB 系列】Jooq 代码自动生成

后文中使用的表结构如下

DROP TABLE IF EXISTS poet;CREATE TABLE poet (  `id` int NOT NULL,  `name` varchar(20) NOT NULL default '',  CONSTRAINT pk_t_poet PRIMARY KEY (ID));DROP TABLE IF EXISTS poetry;CREATE TABLE poetry (  `id` int NOT NULL,  `poet_id` int NOT NULL default '0',  `title` varchar(128) not null default '',  `content` varchar(128) not null default '',  CONSTRAINT pk_t_poetry PRIMARY KEY (ID));

3. 配置文件

h2database 的连接配置如 application.properties

#Database Configurationspring.datasource.url=jdbc:h2:~/h2-jooq-poetspring.datasource.username=testspring.datasource.password=spring.datasource.driverClassName=org.h2.Driver#jOOQ Configurationspring.jooq.sql-dialect=H2spring.datasource.initialization-mode=neverspring.datasource.continueOnError=true##h2 web console设置spring.datasource.platform=h2#进行该配置后,h2 web consloe就可以在远程访问了。否则只能在本机访问。spring.h2.console.settings.web-allow-others=true#进行该配置,你就可以通过YOUR_URL/h2访问h2 web consloespring.h2.console.path=/h2#进行该配置,程序开启时就会启动h2 web consloespring.h2.console.enabled=true

II. 新增记录

接下来我们进入正式的数据插入的使用姿势介绍,一般来说新增数据会区分单个和批量两种方式,下面我们分别进行介绍

1. Record 实体类新增方式

在 jooq 中,借助自动生成的 Record 类来实现新增是最简单的 case,如下

private static final PoetTB table = PoetTB.POET;@Autowiredprivate DSLContext dsl;/** * 新增记录 * * @param id * @param name * @return */public boolean save(int id, String name) {    PoetPO record = dsl.newRecord(table);    record.setId(id);    record.setName(name);    return record.insert() > 0;}

注意:

  • 实体类的创建方式:PoetPO record = dsl.newRecord(table);,不要直接 new 一个对象出来使用

2. 链式写法

下面介绍的这种写法和 sql 非常相似,也是我个人用的比较多的方式,特点就是一目了然

public boolean save2(int id, String name) {    return dsl.insertInto(table).set(table.ID, id).set(table.NAME, name).execute() > 0;}

3. InsertQuery 方式

上面两种写法比较常见,而直接使用 InsertQuery 的方式,在实际的业务开发中可能并没有上面的优雅,但某些特殊场景下还是很有用的

/** * 不使用自动生成的代码来原生插入数据 * * @param id * @param name * @return */public boolean save3(int id, String name) {    // 当不使用自动生成的对象时,table可以用 DSL.table()指定,列可以用 DSL.field()指定    InsertQuery insertQuery = dsl.insertQuery(DSL.table("poet"));    insertQuery.addValue(DSL.field("id", Integer.class), id);    insertQuery.addValue(DSL.field("name", String.class), name);    return insertQuery.execute() > 0;}

注意一下上面的用法,InsertQuery本身的使用没有什么值得说到的,重点在上面的实现中,并没有利用自动生成的代码,如

  • table: DSL.table(表名)
  • field: DSL.field(列名,类型)

通过上面的的 case,我们可以知道在不自动生成 DB 对应的代码前提下,如何进行数据库的操作

4. Record 实体批量保存

借助dsl.batchInsert来批量添加实体,属于最基础的使用姿势了

private PoetPO bo2po(PoetBO bo) {    PoetPO po = dsl.newRecord(table);    po.setId(bo.getId());    po.setName(bo.getName());    return po;}/** * 通过Record执行批量添加 * * @param list * @return */public boolean batchSave(List list) {    List poList = list.stream().map(this::bo2po).collect(Collectors.toList());    int[] ans = dsl.batchInsert(poList).execute();    System.out.println(JSON.toJSONString(ans));    return true;}

5. 链式批量保存

同样是类 sql 的链式插入方式,需要注意一下与前面的单条记录的链式插入的区别,下面这种写法和 sql 的批量插入的写法及其相似

/** * 类sql写法,批量添加 * * @param list * @return */public boolean batchSave2(List list) {    InsertValuesStep2 step = dsl.insertInto(table).columns(table.ID, table.NAME);    for (PoetBO bo : list) {        step.values(bo.getId(), bo.getName());    }    return step.execute() > 0;}

6. InsertQuery 批量保存

上面介绍了 InsetQuery 的单条插入方式,下面的批量写法基本上没有太大的区别

/** * 不基于自动生成的代码,来批量添加数据 * * @param list * @return */public boolean batchSave3(List 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;}

7. 测试 case

接下来测试一下上面的 6 个方法执行

public void test() {    this.save(11, "一灰");    this.save2(12, "一灰灰");    this.save3(13, "一灰灰Blog");    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")));    RecordMapper mapper =            dsl.configuration().recordMapperProvider().provide(table.recordType(), PoetBO.class);    List result = dsl.selectFrom(table).fetch().map(mapper);    System.out.println(result);}

输出结果如下

[1,1][PoetBO (1, 李白), PoetBO (2, 艾可翁), PoetBO (11, 一灰), PoetBO (12, 一灰灰), PoetBO (13, 一灰灰Blog), PoetBO (14, yh), PoetBO (15, yhh), PoetBO (16, yihui), PoetBO (17, yihuihui), PoetBO (18, YiHui), PoetBO (19, YiHuiBlog)]

II. 其他

0. 项目

系列博文

  • 【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

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

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

    [SpringBoot DB系列]Jooq批量写入采坑记录 前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入-,这 ...

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

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

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

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

  4. 拦截器获取请求参数post_「SpringBoot WEB 系列」RestTemplate 之自定义请求头

    [WEB 系列]RestTemplate 之自定义请求头 上一篇介绍了 RestTemplate 的基本使用姿势,在文末提出了一些扩展的高级使用姿势,本篇将主要集中在如何携带自定义的请求头,如设置 U ...

  5. git 代码回退_「Vue 入门系列」第三期,适合新手入门的 Git 使用教程

    引言 Git 工具对于程序员来说已经不陌生了,在开发中也算是必不可少的工具了,本期我们就来看看如何利用 Git 管理代码,以及如何将代码提交到远程(线上) Github 仓库中. 主题:使用 Git ...

  6. stm32捕获占空比_「话说定时器系列」之六:STM32定时器输入捕获话题

    STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...

  7. STC用PCA测量脉宽_「话说定时器系列」之九:定时器单通道测量脉宽和占空比

    STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...

  8. spring boot高性能实现二维码扫码登录(中)——Redis版

    前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...

  9. 【Redis版】spring boot高性能实现二维码扫码登录(中)

    作者: 刘冬 来源:http://www.cnblogs.com/GoodHelper/p/8643071.html 前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户 ...

最新文章

  1. Microsoft Azure部署MYSQL-MMM(3)配置MYSQL-MMM
  2. 慕课网 javascript深入浅出编程练习
  3. 软件架构视图—4+1模式
  4. html固定且居中布局含footer,如何用一行 CSS 实现 10 种现代布局?
  5. 终于有篇看的懂的 B 树文章了!
  6. SAP UI渲染模式:客户端渲染 VS 服务器端渲染
  7. Dapr + .NET 实战(十二)服务调用之GRPC
  8. 【C++深度剖析教程14】经典问题解析三之关于赋值的疑问
  9. 2019五一建模A题思路
  10. 基于Multisim的555时基电路
  11. 关于多媒体编解码器和音视频格式
  12. vbs基础教程(1)
  13. dp交换机命令_交换机常用指令总结
  14. 「笔耕不辍」悲观锁和乐观锁的区别以及实现方式
  15. 前端如何进行seo优化
  16. html中js左右图片切换效果,JS实现图片切换特效
  17. 全球诺贝尔奖得主最多的30所大学排名
  18. win10虚拟机环境下运行驱动程序
  19. [转]RFC1867协议客户端实现
  20. 条形码宽度大小为什么不能任意调整?是打印机问题还是软件问题?

热门文章

  1. Oracle ogg00446,OGG-00446 分析与解决
  2. php 闪电,PHP闪电入门(1) 教程说明
  3. pythonimportpath_python import搜索路径与重新导入
  4. J-Link弹出The connected J-Link is defective解决方法
  5. dataGridView 美化
  6. Domino从不会慢
  7. 使用Flex布局-实现静态携程网移动端首页
  8. 奋斗吧,程序员——第十八章 山盟虽在,锦书难托
  9. 视频流媒体RTSP专用播放器RTSP拉流、RTMP推流方案之EasyPlayer-RTSP-Win抓图代码重构流程介绍
  10. 开源集合-最火的Android开源项目(二)