Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【SpringBoot DB 系列】Jooq 之新增记录使用姿势

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

原创
作者头像
一灰灰blog
修改于 2020-09-30 02:23:25
修改于 2020-09-30 02:23:25
1.2K0
举报
文章被收录于专栏:小灰灰小灰灰

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

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

<!-- more -->

I. 项目搭建

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

1. 项目依赖

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

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

代码语言:txt
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jooq</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
</dependencies>

2. 数据库初始化

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

后文中使用的表结构如下

代码语言:txt
AI代码解释
复制
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

代码语言:txt
AI代码解释
复制
#Database Configuration
spring.datasource.url=jdbc:h2:~/h2-jooq-poet
spring.datasource.username=test
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver


#jOOQ Configuration
spring.jooq.sql-dialect=H2


spring.datasource.initialization-mode=never
spring.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 consloe
spring.h2.console.path=/h2
#进行该配置,程序开启时就会启动h2 web consloe
spring.h2.console.enabled=true

II. 新增记录

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

1. Record 实体类新增方式

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

代码语言:txt
AI代码解释
复制
private static final PoetTB table = PoetTB.POET;
@Autowired
private 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 非常相似,也是我个人用的比较多的方式,特点就是一目了然

代码语言:txt
AI代码解释
复制
public boolean save2(int id, String name) {
    return dsl.insertInto(table).set(table.ID, id).set(table.NAME, name).execute() > 0;
}

3. InsertQuery 方式

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

代码语言:txt
AI代码解释
复制
/**
 * 不使用自动生成的代码来原生插入数据
 *
 * @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来批量添加实体,属于最基础的使用姿势了

代码语言:txt
AI代码解释
复制
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<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;
}

5. 链式批量保存

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

代码语言:txt
AI代码解释
复制
/**
 * 类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;
}

6. InsertQuery 批量保存

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

代码语言:txt
AI代码解释
复制
/**
 * 不基于自动生成的代码,来批量添加数据
 *
 * @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;
}

7. 测试 case

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

代码语言:txt
AI代码解释
复制
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<PoetPO, PoetBO> mapper =
            dsl.configuration().recordMapperProvider().provide(table.recordType(), PoetBO.class);
    List<PoetBO> result = dsl.selectFrom(table).fetch().map(mapper);
    System.out.println(result);
}

输出结果如下

代码语言:txt
AI代码解释
复制
[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. 项目

系列博文

项目源码

1. 一灰灰 Blog

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【SpringBoot DB 系列】Jooq 之新增记录使用姿势
接下来我们开始进入 jooq 的增删改查的使用姿势系列,本篇将主要介绍如何利用 jooq 来实现添加数据
一灰灰blog
2020/10/26
6010
【SpringBoot DB系列】Jooq批量写入采坑记录
前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入...,这就有点尬了
一灰灰blog
2020/12/13
1.2K0
【SpringBoot DB系列】Jooq批量写入采坑记录
【SpringBoot DB系列】Jooq批量写入采坑记录
前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入...,这就有点尬了
一灰灰blog
2020/12/16
1.6K0
【SpringBoot DB系列】Jooq批量写入采坑记录
【SpringBoot DB 系列】Jooq 初体验
java 环境中,说到数据库的操作,我们通常会想到的是 mybatis 或者 hibernate,今天给大家介绍一个国内可能用得不太多的操作方式 JOOQ,一款基于 Java 访问关系型数据库的工具包,轻量,简单,并且足够灵活的 ORM 框架
一灰灰blog
2020/09/16
1.3K0
【SpringBoot DB 系列】Jooq 初体验
SpringBoot系列教程JPA之新增记录使用姿势
上一篇文章介绍了如何快速的搭建一个JPA的项目环境,并给出了一个简单的演示demo,接下来我们开始业务教程,也就是我们常说的CURD,接下来进入第一篇,如何添加数据
一灰灰blog
2019/07/02
1.5K0
SpringBoot系列教程JPA之新增记录使用姿势
【SpringBoot DB 系列】h2databse 集成示例 demo
h2dabase 基于内存的数据库,更常见于嵌入式数据库的使用场景,依赖小,功能齐全;一般来讲,正常的商业项目用到它的场景不多,但是在一些特殊的 case 中,还是比较有用的,比如用于单元测试,业务缓存,一些简单的示例 demo 等;本文将手把手教你创建一个继承 h2dabase 的项目,并支持从 sql 中导入预定好的 schema 和 data
一灰灰blog
2020/09/15
8690
【SpringBoot DB 系列】h2databse 集成示例 demo
SpringBoot高级篇搜索Solr之 文档新增与修改使用姿势
大多涉及到数据的处理,无非CURD四种操作,对于搜索SOLR而言,基本操作也可以说就这么几种,在实际应用中,搜索条件的多样性才是重点,我们在进入复杂的搜索之前,先来看一下如何新增和修改文档
一灰灰blog
2019/07/02
1.2K0
SpringBoot高级篇搜索Solr之 文档新增与修改使用姿势
SpringBoot高级篇JdbcTemplate之数据插入使用姿势详解
使用SpringBoot进行db操作引入几个依赖,就可以愉快的玩耍了,这里的db使用mysql,对应的pom依赖如
一灰灰blog
2019/05/26
4K1
【SpringBoot + Mybatis系列】Mapper接口注册的几种方式
SpringBoot项目中借助Mybatis来操作数据库,对大部分java技术栈的小伙伴来说,并不会陌生;我们知道,使用mybatis,一般会有下面几个
一灰灰blog
2021/07/26
1K0
【SpringBoot + Mybatis系列】Mapper接口注册的几种方式
第十四节:SpringBoot使用JdbcTemplate访问操作数据库基本用法
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。 JdbcTemplate在Spring-jdbc包下面,还需要Spring-tx包支持,里面包含事务和异常控制. 建一个rumenz_springboot库 创建user表 create table user( id int primary key auto_increment, name varchar(100) not null default '
入门笔记
2022/02/21
3500
第十四节:SpringBoot使用JdbcTemplate访问操作数据库基本用法
SpringBoot系列教程JPA之update使用姿势
原文: 190623-SpringBoot系列教程JPA之update使用姿势 上面两篇博文拉开了jpa使用姿势的面纱一角,接下来我们继续往下扯,数据插入db之后,并不是说就一层不变了,就好比我在
一灰灰blog
2019/07/02
2.3K0
SpringBoot系列教程JPA之update使用姿势
SpringBoot系列教程JPA之指定id保存
原文链接: 191119-SpringBoot系列教程JPA之指定id保存 前几天有位小伙伴问了一个很有意思的问题,使用 JPA 保存数据时,即便我指定了主键 id,但是新插入的数据主键却是 mysq
一灰灰blog
2019/11/21
3.1K0
重学Springboot系列之整合数据库开发框架---中
在实际的开发过程中,由于业务的复杂性,通常并不能做到一个model实体贯穿持久层、服务层、控制层。通常需要进行实体对象java bean的赋值转换。
大忽悠爱学习
2021/12/07
1.7K0
重学Springboot系列之整合数据库开发框架---中
SpringBoot高级篇MongoDB之修改基本使用姿势
本篇依然是MongoDB curd中的一篇,主要介绍document的更新,主要内容如下
一灰灰blog
2019/05/26
6.2K1
SpringBoot 系列教程 JPA 错误姿势之环境配置问题
又回到 jpa 的教程上了,这一篇源于某个简单的项目需要读写 db,本想着直接使用 jpa 会比较简单,然而悲催的是实际开发过程中,发现了不少的坑;本文为错误姿势第一篇,Repository 接口无法注入问题
一灰灰blog
2019/12/24
9290
SpringBoot 系列教程 JPA 错误姿势之环境配置问题
springboot(3)--持久化
上一篇我们讲述了springboot和各种常见的数据库连接池融合,此篇将讲述 一下springboot与各种常见的持久层框架融合。
叔牙
2020/11/19
1.2K0
springboot(3)--持久化
【SpringBoot Mybatis系列】MapperMapper接口与Sql绑定几种姿势
通常我们在使用Mybatis进行开发时,会选择xml文件来写对应的sql,然后将Mapper接口与sql的xml文件建立绑定关系,然后在项目中调用mapper接口就可以执行对应的sql
一灰灰blog
2021/07/26
1.1K0
【SpringBoot Mybatis系列】MapperMapper接口与Sql绑定几种姿势
SpringBoot高级篇DB之基本使用
现在的完整的后端项目,基本上离不开DB、缓存,接下来开始进入DB篇的系列教程,首先确定我们的目标,一个是知道怎么配置,怎么用;接着就是更高级一点的多个数据源的配置,使用不同的方式来实现CURD(如Mybatis, JPDA, MyCat, Hibernate, Jooq等),数据库不得不谈到的事物管理,锁机制,以及高级一点的分库分表等;然后再进一步则是优秀的框架的学习了,大名鼎鼎的MyBaits的设计思路,Jooq的使用姿势也特别有意思
一灰灰blog
2019/03/14
1.4K0
SpringBoot高级篇DB之基本使用
SpringBoot系列Mybatis之参数传递的几种姿势
在 mybatis 的日常开发中,mapper 接口中定义的参数如何与 xml 中的参数进行映射呢?除了我们常用的@Param注解之外,其他的方式是怎样的呢?
一灰灰blog
2021/09/25
1.9K0
SpringBoot配置使用H2数据库
自动去创建数据库,借用Spring Data Jpa的注解,启动时自动创建内存数据库
是小张啊喂
2021/08/10
4K0
SpringBoot配置使用H2数据库
推荐阅读
相关推荐
【SpringBoot DB 系列】Jooq 之新增记录使用姿势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档