JOOQ学习(一)

一、简介

JOOQ全称Java Object Oriented Querying,基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活,可以轻松的使用Java面向对象语法来实现各种复杂的sql。

JOOQ 既吸取了传统ORM操作数据的简单性和安全性,又保留了原生sql的灵活性,它更像是介于 ORMS和JDBC的中间层。可以使用Java代码写出sql的感觉来。

如同官网[https://www.jooq.org/]所说:

get back in control of your sql

二、原理

jOOQ,是一个ORM框架,利用其生成的Java代码和流畅的API,可以快速构建有类型约束的安全的SQL语句

jOOQ使重心可以放在业务逻辑上,而Java与SQL的基础交互部分,都可以交给jOOQ去处理。jOOQ支持很多数据库,而且有商业版本和社区版本区别,商业版本和社区版本区别主要是支持数据库不一样,可以在其授权说明页面上看到各个版本对于数据库的支持情况,开源版本只支持部分开源数据库如MySQL等

jOOQ的核心优势是可以将数据库表结构映射为Java类,包含表的基本描述和所有表字段。通过jOOQ提供的API,配合生成的Java代码,可以很方便地进行数据库操作

生成的Java代码字段类型是根据数据库映射成的Java类型,在进行设置和查询操作时,因为是Java代码,都会有强类型校验,所以对于数据的输入,是天然安全的,极大的减少了SQL注入的风险

jOOQ的代码生成策略是根据配置全量生成,任何对于数据库的改动,如果会影响到业务代码,在编译期间就会被发现,可以及时进行修复

三、流程

官网文档提到7步走

Step 1: Preparation

Step 2: Your database

Step 3: Code generation

Step 4: Connect to your database

Step 5: Querying

Step 6: Iterating

Step 7: Explore

开发流程大致就是三步:

创建/更新 数据库表

通过JOOQ插件生成Java代码

进行业务逻辑开发

四、使用

Maven配置

jOOQ 提供了 maven 插件 jooq-codegen-maven,通过配置可以进行代码生成操作,配置项主要是jdbc连接,目标数据库,表,以及生成的路径包名等

<properties> <jooq.version>3.15.3</jooq.version> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> <!-- base jooq dependency --> <dependency> <groupId>org.jooq</groupId> <artifactId>jooq</artifactId> <version>${jooq.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- 代码生成器插件 --> <plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <version>${jooq.version}</version> <configuration> <jdbc> <driver>com.mysql.cj.jdbc.Driver</driver> <url>jdbc:mysql://127.0.0.1:3306/jooq</url> <user>root</user> <password>123456</password> </jdbc> <generator> <database> <includes>*</includes> <inputSchema>jooq</inputSchema> </database> <target> <packageName>com.learn.jooq.codegen</packageName> <directory>/src/main/java</directory> </target> </generator> </configuration> </plugin> </plugins> </build>
代码生成

代码生成的原理就是通过读取数据库的元数据,将其转换为Java代码,并生成指定的文件,存放到配置好的指定目录

jOOQ的生成代码的目标路径建议配置单独的子包,因为每次代码生成都是全量的,如果和其他业务代码混合在一起,会被生成器误删

# 通过此命令里可以调用 jooq-codegen-maven 插件进行代码生成 mvn jooq-codegen:generate

代码生成器执行完成后,会生成以下目录:

├─src/main/java/.../codegen ---- // 生成路径 │ ├─tables --------------------- // 表定义目录 │ │ ├─pojos ------------------- // 存放和表一一对应的 POJO 类 │ │ └─records ------------------ // 储存一条表记录的字段和值,提供了一系列针对行记录对象的操作方法,如get、set等 │ │ └─interfaces ----------- // 由records和pojos实现,便于进行record和pojo之间的转换 │ │ └─daos ----------- // 提供了常用的查询操作的封装 │ │ └─表数据 ----------- // 表描述信息,提供了获取表字段、索引、主键、重命名等方法供daos和records中的类调用 │ ├─DefaultCatalog ------------- // Catalog对象,包含Schema常量 │ ├─Indexes -------------------- // 包含数据库所有的索引常量 │ ├─Keys ----------------------- // 包含数据库所有表的主键、唯一索引常量 │ ├─Jooq ------------------ // 数据库`jooq`常量,包含该库所有表描述常量 │ └─Tables --------------------- // 包含所有数据库表常量
操作

1.直接通过SQL执行器DSLContext,DSLContext抽象了所有SQL操作

2.针对特定记录的操作可以直接调用Record对象的方法

API

org.jooq.Result
结果集接口,此接口实现了List接口,可以当做一个集合来操作,是一个数据库查询结果集的包装类,除了集合的相关方法,该接口还提供了一些结果集转换,格式化,提取字段等方法。通常我们查询出来的结果都是此接口的实现类,掌握好此接口是jOOQ的基础接口,基本所有的SQL查询操作,都会碰到这个接口

org.jooq.Record
此接口再使用关系型数据库时,主要用于定义数据库表记录,储存的内容是一条表记录的字段和值,每个值会储存对应字段的类型,可以通过通用的 getValue(Field field) 方法,取到对应字段的值,也可以将这个接口看做是一条记录的字段/值映射

在使用了代码生成器后,会基于此接口生成对应表的实现类,该实现类基于数据库表字段生成所有字段的 get/set 方法,可以通过 getXXX/setXXX(..) 直观的获取或设置指定的值用于读取/更新等后续操作。对于编码来说,代码的可读性大大提升

org.jooq.DSLContext
jOOQ的核心接口之一,可以理解为一个SQL执行器,通过静态方法 DSL.using,可以获取一个 DSLContext 实例,此实例抽象了所有对于SQL的操作API,可以通过其提供的API方便的进行SQL操作

/** * 通过数据库连接和方言配置来创建一个执行器对象 * @param connection 数据库连接 * @param dialect 指定方言, 传入此参数的目的是,在jOOQ渲染SQL的语句的时候,会根据SQL方言配置,使用不同的语法规则去生成SQL语句字符串。 */ public static DSLContext using(Connection connection, SQLDialect dialect) { return new DefaultDSLContext(connection, dialect, null); }