
背景
由于 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 的策略保持一致。
作者:
任锴,目前就职于杭州匠人网络,致力于楼宇资产管理的 SaaS 化,负责后端业务架构设计,喜欢对业务模型的分析,热衷新技术的探索和实践,经常在踩坑的路上越走越远。
更多内容推荐
- SQL Server 2016:内存列存储索引- SQL Server 2016的一项新特性是可以在“内存优化表(Memory Optimized Table)”上添加“列存储索引(Columnstore Index)”。列存储索引虽然没有传统的B树索引那么快,但比表扫描要快得多。这特别适合于那种无法预测需要什么索引的即时报表。 架构
- JetBrains 0xDBE: DBA 和 SQL 开发人员的专属工具- 到目前为止,JetBrains的IDE中已经内置了多个处理数据库管理和开发任务的插件。JetBrains决定将这些相应的功能提取出来,置于一个独立的名为0xDBE的 IDE中。 
- 数据库迁移服务 DMS——手把手教你玩转 MongoDB 到 DynamoDB 之间数据库迁移- AWS最近刚刚宣布了一项关于数据库迁移的新feature,支持Mongodb数据库作为源端,迁移到目标端Dynamodb中,这样可以使MongoDB的用户充分利用DynamoDB数据库提供的技术优势,譬如完全托管服务,高性能低延迟(毫秒级),精细化粒度控制等等。 
- 架构师训练营 - 第⑧周总结- 数据结构与算法、网络通信协议、I/O、数据库 - 2020 年 7 月 28 日 
- web-view(四):如何在服务器端实现 cookie 与 sesson 的生成?- 2020 年 6 月 25 日 
- web-view(八):了解正确的微信登陆姿势- 2020 年 7 月 2 日 
- JLINQ: Eclipse 的运行时 JDBC 生成器- BM公司的Azadeh Ahadian最近在IBM的DeveloperWorks网站发表了介绍JLINQ的文章。除了在名称上相似之外,JLINQ与微软的LINQ基本是两码事,实际上JLINQ是Eclipse的插件,提供数据库整合与运行时DAO代码的生成功能。JLINQ插件是IBM Developer Workbench的一部分,将出现在下一个版本的DB2(Viper)之中。 
- 文章:DrySQL 和 ActiveRecord 中的 ORM 应用- 作者Bryan是DrySQL的一名开发者,在使用ActiveRecord的过程中,他感觉到其实ActiveRecord并不能贯彻DRY原则,特别是当你的数据库没有遵循Rails命名传统时。同样,ActiveRecord的关联与校验也是对数据库约束的冗余定义。Bryan想(尽可能地)避免这种情况的发生,他不想对自己的数据库schema加以改动,因为那样会令他改变程序的代码。 
- SQL 注入实战:利用时间盲注绕过无报错无回显场景- 2020 年 7 月 23 日 
- Elasticsearch 简介及其发展历史- 2019 年 6 月 24 日 
- Oracle NoSQL Database 3.0 支持表数据模型和辅助索引- Oracle NoSQL Database的最新版本支持表数据模型、辅助索引,并通过集成Oracle Wallet增强了安全性,而且还增强了数据中心。近日,Oracle宣布发布该分布式键-值数据库的3.0版本。 
- 在 Spring 中同时访问多种不同数据库- 在企业应用中同时使用多种数据库总不是一件容易的事。使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了。本文示范了一种在Spring 下同时访问多种数据库的方法,而且尽量地简化配置改动。 
- 使用 Python 将 MongoDB 数据导到 MySQL- MySQL Shell 8.0.13(GA)引入了一项新功能,让你可以轻松地将JSON文档导入到MySQL。这篇文章将介绍这项功能的实际用例:如何将MongoDB中的JSON数据导入MySQL。这些方法同样适用于将数据从其他文档存储数据库导入MySQL,只要它们能够生成或导出JSON数据。 
- Data Geekery 发布了 Java ORM 工具 jOOQ 的 3.9.0 版,用于构建类型安全查询- Data Geekery公司发布了其Java ORM工具包jOOQ的3.9.0版。jOOQ实现从数据库生成代码,用于类型安全查询。本文给出了jOOQ的入门实例,并通过访谈介绍了jOOQ的主要特性及进一步发展。 
- Spring Bean 的别名:为什么命名 Bean 还需要别名?- 2020 年 1 月 16 日 
- 从研究到落地:大规模 AI/CV 落地应用的趋势和挑战- 无 - 2019 年 1 月 7 日 
推荐阅读
- VMware 的 CloudFoundry 服务获得对 PostgreSQL 支持
- Elasticsearch 的安装与简单配置- 2019 年 6 月 24 日 
- 比 MySQL 快 839 倍!揭开分析型数据库 JCHDB 的神秘面纱- 2020 年 10 月 15 日 
- Bean 验证规范初稿发布
- 织云 Metis 时间序列异常检测全方位解析- 2018 年 9 月 12 日 
- Raven——一个.NET 上的文档数据库
- 构建 Java API 的艺术:Do's and Don'ts(英文演讲)- 2018 年 11 月 8 日 
电子书

大厂实战PPT下载
换一换 
肖凯 | 蚂蚁金服 无线开发专家
魏文庆 | 网易严选 数据技术及产品部总监
唐君行 | bilibili 视频云资深研发工程师










 
    
评论