0

【DB系列】Jooq初体验

 收集于2周前 阅读数 0
以下为 快照 页面,建议前往来源网站查看,会有更好的阅读体验。
原文链接: http://spring.hhui.top/spring-blog/2020/09/15/200915-SpringBoot系列Jooq初体验/

java环境中,说到数据库的操作,我们通常会想到的是mybatis或者hibernate,今天给大家介绍一个国内可能用得不太多的操作方式JOOQ,一款基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活的ORM框架

本文将各位小伙伴演示一下jooq集成springboot的姿势

I. 项目搭建

我们这里借助h2dabase来搭建演示项目,因此有兴趣的小伙伴在文末可以直接获取项目地址启动即可体验,不需要额外的安装和配置mysql了

本文采用 SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA 进行开发

1. pom依赖

下面给出核心的依赖配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jooq</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

2. 配置

接下来设置一下数据库相关的配置信息,在资源目录 resources 下,新建配置文件 application.properties

#Database Configuration
spring.datasource.url=jdbc:h2:~/h2-jooq-db
spring.datasource.username=test
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver

3. 数据库初始化

jooq有一个特点,是需要我们自己来生成表结构对象,所以我们先初始化一下h2dabase的数据结构,详情可以参考博文 【DB系列h2databse集成示例demo】

表结构定义文件 schema-h2.sql , 请注意表结构与mysql的表创建姿势不太一样哦

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)
);

数据初始化 data-h2.sql

INSERT INTO `poet` (`id`, `name`)
VALUES
true(1, '李白'),
true(2, '艾可翁'),
true(3, '敖陶孙'),
true(4, '安稹'),
true(5, '艾性夫'),
true(6, '奥敦周卿'),
true(7, '安鏖'),
true(8, '阿鲁威'),
true(9, '安鸿渐'),
true(10, '安邑坊女');

我们接下来借助maven插件来初始化数据, pom.xml 文件中,添加如下配置

<!-- The H2 test schema is loaded here -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>sql-maven-plugin</artifactId>

    <executions>
        <execution>
            <id>create-database-h2</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>execute</goal>
            </goals>
        </execution>
    </executions>

    <configuration>
        <driver>org.h2.Driver</driver>
        <url>jdbc:h2:~/h2-jooq-db</url>
        <username>test</username>
        <password></password>
        <autocommit>true</autocommit>
        <srcFiles>
            <srcFile>src/main/resources/schema-h2.sql</srcFile>
            <srcFile>src/main/resources/data-h2.sql</srcFile>
        </srcFiles>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>
    </dependencies>
</plugin>

如下图的case,完成数据的初始化

JnyIVjQ.jpg!mobile

II. 体验case

在实际开始jooq的curd之前,需要先生成对应的表结构对象,这里也是借助maven插件来完成

1. 代码自动生成

同样在 pom.xml 中添加如下配置

<plugin>
      <groupId>org.jooq</groupId>
      <artifactId>jooq-codegen-maven</artifactId>

      <executions>
          <execution>
              <id>generate-h2</id>
              <phase>generate-sources</phase>
              <goals>
                  <goal>generate</goal>
              </goals>
          </execution>
      </executions>
      <configuration>
          <jdbc>
              <!-- 数据库相关配置 -->
              <driver>org.h2.Driver</driver>
              <url>jdbc:h2:~/h2-jooq-db</url>
              <username>test</username>
              <password></password>
          </jdbc>
          <generator>
              <database>
                  <!-- 数据库的基本信息 -->
                  <name>org.jooq.meta.h2.H2Database</name>
                  <includes>.*</includes>
                  <excludes></excludes>
                  <inputSchema>PUBLIC</inputSchema>
              </database>
              <generate>
                  <deprecated>false</deprecated>
                  <instanceFields>true</instanceFields>
                  <pojos>true</pojos>
              </generate>
              <target>
                  <!-- 自动生成的类的包名,以及路径 -->
                  <packageName>com.git.hui.boot.jooq.h2</packageName>
                  <directory>src/main/java</directory>
              </target>
          </generator>
      </configuration>
  </plugin>

uAveEze.jpg!mobile

如上图的方式执行完毕之后,会得到生成的代码

2. CURD

接下来我们给出CURD的基本使用姿势

import static com.git.hui.boot.jooq.h2.tables.Poet.POET;

@Service
public class PoetService {

    @Autowired
    DSLContext dsl;

    public int create(int id, String author) {
        return dsl.insertInto(POET).set(POET.ID, id).set(POET.NAME, author).execute();
    }

    public PoetRecord get(int id) {
        return dsl.selectFrom(POET).where(POET.ID.eq(id)).fetchOne();
    }

    public int update(int id, String author) {
        return dsl.update(POET).set(POET.NAME, author).where(POET.ID.eq(id)).execute();
    }

    public int delete(int id) {
        return dsl.delete(POET).where(POET.ID.eq(id)).execute();
    }

    public List<PoetRecord> getAll() {
        return dsl.selectFrom(POET).fetch();
    }
}

注意上面的使用,很好理解了,基本上能愉快的写sql,就可以愉快的使用jooq,上面的这种链式写法,对于sql的阅读是非常友好的;这里的重点是 DSLContext ,它是 JooqAutoConfiguration 自动加载的,这里直接拿来使用了(关于更多的配置与多数据源的问题,后面介绍)

3. 测试case

在pom中引入 web 依赖,设计一些基本的测试case

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

增删改查case

@RestController
public class PoetRest {
    @Autowired
    private PoetService poetService;

    @RequestMapping(path = "add")
    public int add(Integer id, String name) {
        return poetService.create(id, name);
    }

    @GetMapping(path = "get")
    public String get(Integer id) {
        PoetRecord record = poetService.get(id);
        return r2str(record);
    }

    @GetMapping(path = "list")
    public List<String> list() {
        List<PoetRecord> list = poetService.getAll();
        return list.stream().map(this::r2str).collect(Collectors.toList());
    }


    @GetMapping(path = "update")
    public int update(int id, String author) {
        return poetService.update(id, author);
    }

    @GetMapping(path = "del")
    public int delete(int id) {
        return poetService.delete(id);
    }


    private String r2str(PoetRecord record) {
        return record.getId() + " # " + record.getName();
    }
}

实测结果如下

UJRvEva.jpg!mobile

4. 小结

到此,SpringBoot集成jooq的demo已经完成,并提供了基础的CURD,整体来看,集成比较简单,需要注意的是代码自动生成,我们这里是借助maven插件来实现代码自动生成的, 此外也可以通过官方提供的 jooq-xx.jar + xml 配置文件来自动生成;后面单独捞一篇博文给与介绍

从jooq的使用姿势来看,最大的感官就是类sql的链式写法,比较的直观,阅读友好;此外需要注意的是自动生成的实体 PoetRecord ,不要暴露出去哦,一般推荐使用jooq包下面的 Poet 来代替 PoetRecord 来作为BO对象使用,可以通过 RecordMapper 来实现转换,如下

public Poet getById(int id) {
    PoetRecord record = dsl.selectFrom(POET).where(POET.ID.eq(id)).fetchOne();
    RecordMapper<PoetRecord, Poet> mapper =
            dsl.configuration().recordMapperProvider().provide(POET.recordType(), POET.getClass());
    return mapper.map(record);
}

II. 其他

0. 项目

1. 一灰灰Blog

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

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

ri6Vj2M.png!mobile

打赏 如果觉得我的文章对您有帮助,请随意打赏。


猜你喜欢

  • 110

    jOOQ's main value proposition is obvious: Type safe embedded SQL in Java. People who actively look for such a SQL builder will inevitably stumble upon jOOQ and love it, of course. But a lot of people don't really need a SQL builder - yet, jOOQ c...

  • 2

    jOOQ generates Java code from your database...

  • 34

    对 OPPO 来说,2018 的上下半年完全是两个样子。 上半年的 OPPO 依然是我们印象里最熟悉的那个 OPPO,R 系列(R15 和 R15 梦境版)主打时尚潮品,明星代言人要两只手才能数过来,A 系列则继续在 1000-2000 元的中低端市场用配置...

  • 2

    Spring5就引入了Webflux,基于响应式编程的web框架,号称相比较于传统的SpringMVC性能更加(当然我也没测过,官方以及很多用过的小伙伴都持有这个观点),近年来响应式编程越来越主流了,作为一个紧跟时代潮流的小伙,有必要深入学习一下...

  • 184

    快手产品体验分析报告

    本文作者抱着学习的态度,体验了快手这款独角兽产品,从而试着了解中国三四线及农村用户的核心需求。 整天坐在办公室的产品经理是肯定做不出快手这款APP的,相传快手的CEO是在三四线城市居住了几年才做出来这款火爆中国的产品。由于短视频从去年一直处在风口上,而...

  • 144

    9月21日,中国铁路总公司官方宣布,从今日起,7对“复兴号”动车组正式在京沪高铁按时速350公里运行,分别为:G1/G2、G3/G4、G5/G6、G7/G8、G9/G10、G13/G14、G17/G18次。据了解,提速后,北京到上海之间全程运行时间在4个半小时左右,比原来快了30分钟。

  • 121

  • 114

    原标题:iPhoneX看网页是啥体验网友称无法直视[手机中国新闻]本月,万众期待的iPhoneX终于和大家见面了,虽说作为苹果10周年的作品,但是却并没有赢得一致好评,最被人们诟病的就是正面上方的“刘海”设计。在影响美观的同时,在观看视频、

  • 82

    因为前刘海设计,让iPhoneX的整体显示效果割裂感十足,特别是在观看视频、网页的时候,而苹果也是在努力的去引导开发者去如何避免这个情况,当然前提条件都是要美化刘海,如果你执意不听的话,结果可想而知。现在,Safari网页团队公布了一组iPhoneX浏览网页的视觉...

  • 188

    中国首间 Dyson Demo 体验店在上海开业

    虽说戴森之前在国内,已经开设了四间概念店和数百个商场专柜,但更能全方位展示其产品的 Dyson Demo 体验店,在经过了长久的筹备后直到今天才终于在上海开张。这家选址在南京西路兴业太古汇的新店,拥有酷似戴森吸尘器尘桶的独特外型(咦?)。当年 James Dyson 爵...

关于极客头条


聚合每日国内外有价值,有趣的链接。

AD