背景
由于 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 视频云资深研发工程师
评论