JOOQ类生成(Code generation from entities)

2019 年 10 月 21 日

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 化,负责后端业务架构设计,喜欢对业务模型的分析,热衷新技术的探索和实践,经常在踩坑的路上越走越远。


2019 年 10 月 21 日 10:502000

评论

发布
暂无评论
发现更多内容

架构师训练营Lesson2-Homework

强哥

极客大学架构师训练营 依赖倒置

架构师实现架构目标的主要手段(第2周学习总结)

李德政

极客大学架构师训练营

架构师训练营-第二周作业

坂田吴奇隆

极客大学架构师训练营

学习总结 - 架构师训练营 - 第二周

走过路过飞过

架构师第二周作业

跨域刀

极客大学架构师训练营

架构师第二课总结

Dennis

架构师训练营 - 第二周学习总结

清风徐徐

2020-06-13-第二周作业

路易斯李李李

隔离原则优化 Cache 类的设计

潜默闻雨

架构师训练营第二周作业

fenix

依赖倒置

wei

第二周 - 学习总结

molly

极客大学架构师训练营

架构师训练营 - 第二周作业

teslə

架构师训练营第二周作业

草原上的奔跑

编程与设计

eazonshaw

架构师训练营第二周【作业】

atlasman

架构师训练营 第二周【作业】

小K

Python 核心技术与实践 string

Bonaparte

Python string

架构师训练营第二周总结

15359861984

week2 homework

第二周作业

重新来过

2020-06-13-第二周学习总结

路易斯李李李

第二周总结

跨域刀

极客大学架构师训练营

架构师训练营-第二周作业

清风徐徐

单例模式 极客大学架构师训练营 组合模式

依赖倒置原则的个人理解

潜默闻雨

架构师Week2作业

熊威

第二次作业

蒜泥精英

学习心得

蒜泥精英

架构师训练营第二章作业

吴吴

架构师训练营第二周学习总结

人世间

极客大学架构师训练营

<<架构师训练营>> 第二周作业

0x12FD16B

JOOQ类生成(Code generation from entities)-InfoQ