JOOQ 类生成(Code generation from entities)

阅读数:1324 2019 年 10 月 21 日 10:50

JOOQ类生成(Code generation from entities)

背景

由于 querydsl 近两年没有更新,使用 JOOQ 去做动态 sql 查询。JOOQ 是基于 Java 访问关系型数据库的工具包,轻量、简单、安全并且足够灵活,可以轻松的使用 Java 面向对象语法来实现各种复杂的 sql。和 querydsl 一样,JOOQ 也需要生成一堆文件。
生成 JOOQ 类有通过连接数据库、flyway、entity 等方式。企业级应用无法写死数据库地址账号密码在 pom 文件中,flyway 过于死板不利于更新(flyway 文件变更需要更改数据中 checksum,并且需要和数据库严格一致),所以通过 entity 去生成 JOOQ 类。

但是通过官方文档 生成有以下缺点:

1. 需要在 entity 上指定表名,通过 @Table(name = “author”),如不指定表名为大写;

2. 需要在字段上指定字段名,通过 @Column(name = “last_name”),如不指定生成的字段不仅是大写,而且不是下滑线(underline)形式;

3. 不能使用 @Column(columnDefinition = “”);

4. 库名需要指定

总之与 jpa 生成的 table 不符合,所以需要改写插件和代码生成。

JPADatabase

JOOQ 通过 H2 Database 内嵌数据库生成 JOOQ 类。H2 Database 生成的数据库字段名默认全部变为大写,所以造就上述缺点,生成出来的 sql 也都默认大写。需要在连接 h2 的时候 database_to_upper 设置为 false

复制代码
connection = new org.h2.Driver().connect("jdbc:h2:mem:jooq-meta-extensions-" + UUID.randomUUID() + ";MODE=MySQL;database_to_upper=false", info);

使用 SpringPhysicalNamingStrategy 的策略

复制代码
applySetting(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy")

pom 包导入

复制代码
<!-- https://mvnrepository.com/artifact/org.jooq/jooq-codegen -->
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta-extensions</artifactId>
<version>3.11.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
</dependency>

maven 插件

复制代码
<!-- 预编译 entity 文件及 conde-generate 代码 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<executions>
<execution>
<id>pre-compile</id>
<phase>validate</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<includes>
<include>com/example/creams/demo/entity/*</include>
<include>org/jooq/meta/extensions/**</include>
</includes>
</configuration>
</execution>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>3.11.11</version>
<executions>
<execution>
<id>jooq-codegen</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<generator>
<database>
<!-- 指定改写的生成类文件 -->
<name>org.jooq.meta.extensions.jpa.JPADatabaseNew</name>
<inputSchema>PUBLIC</inputSchema>
<!-- 指定数据库的 schema 名 -->
<outputSchema>library</outputSchema>
<properties>
<!-- A comma separated list of Java packages, that contain your entities -->
<!-- 指定 entity 包名 -->
<property>
<key>packages</key>
<value>com.example.creams.demo.entity</value>
</property>
</properties>
</database>
<target>
<!-- 生成地址 -->
<packageName>com.example.creams.demo.jooq</packageName>
</target>
</generator>
</configuration>
</plugin>

设置完上述配置之后,maven compile 就可以在 target 的 generated-sources 文件夹中看到 JOOQ 文件

总结

JOOQ 通过 H2 Database 内嵌数据库生成 JOOQ 类,所以 H2 生成的数据库必须和 JPA 自动生成的数据库相符合。在生成数据库的时候使用 jpa.hibernate.SpringPhysicalNamingStrategy 的策略保持一致。

github 地址

作者:

任锴,目前就职于杭州匠人网络,致力于楼宇资产管理的 SaaS 化,负责后端业务架构设计,喜欢对业务模型的分析,热衷新技术的探索和实践,经常在踩坑的路上越走越远。

评论

发布