介绍
Grails是旨在提高开发效率的Web框架。 主要功能之一是以域为中心的数据库架构生成。 用Grails构建的应用程序能够在启动之前更新现有模式。 为此,Grails在更高级的情况下使用内置的域映射器或迁移。 UWS-jOOQ Grails插件的目标是将jOOQ集成到现有的Grails生命周期中,以利用jOOQ的功能而不损害Grails提供的功能。
本文是位于德国的jOOQ集成合作伙伴 UWS Software Service(UWS)为您提供的系列文章的一部分。 UWS专门从事定制软件开发,应用程序现代化和外包,并且特别关注Java Enterprise生态系统。
为什么我应该将jOOQ与Grails一起使用?
在企业应用程序中,我们经常会遇到Hibernate性能问题,缺乏对某些语句的支持或Hibernate模型造成的太多麻烦。 Hibernate的查询语言HQL通常不够复杂,无法满足某些要求。 这迫使我们使用普通的SQL,这很不错,并且有助于解决特定的业务问题。 但是,在涉及大量人员并且产品不断发展的大型项目中,类型安全性非常宝贵,但是在使用普通SQL时会被丢弃。 这就是jOOQ框架出类拔萃且UWS-jOOQ Grails-Plugin进入游戏的时刻。
如何将jOOQ集成到Grails中?
我们试图使用Grails内置的依赖项解析将jOOQ集成到Grails中。 只需将以下行添加到BuildConfig.groovy的plugins部分:
compile ':uws-jooq:0.1.1'
将插件配置添加到您的Config.groovy:
jooq.dataSource = ['dataSource']
jooq.xmlConfigDir = "src/resources/jooq/"
jooq.generatedClassOutputDirectory = 'src/java'
jooq.generatedClassPackageName.dataSource = 'ie.uws.example'
如本例中所示,该插件允许配置要使用的数据源以及一些键路径。 最后,您还希望在示例集成项目中查看Config.groovy的自定义版本 。
接下来的jOOQ需要一个xml配置文件 ,该文件可以由插件使用以下命令生成。 该插件将使用您现有的数据源及其配置来生成jOOQ配置:
grails jooq-generate-config
现在,所有配置均已准备就绪,现在是时候进入jOOQ的主要功能之一,它是类型安全的SQL。 使用以下命令,jOOQ将生成您在编写SQL时要使用的Java类,因为它们将为您提供基于编译器的自动完成功能:
grails jooq-init
现在一切就绪,假设您要通过一个控制器中的jOOQ将新记录插入数据库中。 就这么简单:
class ExampleController {
JooqService jooqService
def insert() {
DSLContext dsl = jooqService.dataSource
BookRecord record = dsl.newRecord(Tables.BOOK)
record.author = "John"
record.name = "Uws"
record.version = 1
record.store()
}
}
jOOQ与Grails的集成如何在后台进行?
在上面的示例中,您注意到JooqService是Grails依赖注入的。 在Grails中使用jOOQ时,JooqService是您的切入点,因为它能够选择您的数据源并为您提供jOOQ DSL上下文。 当您有多个数据源时,它还允许您仅通过提供其名称来选择其他数据源:
DSLContext dsl = jooqService.dataSource_custom
请注意,自动补全功能不会告诉您dataSource_custom
字段的存在,但JooqService会为您处理。
在版本0.1中,我们添加了JooqService,但必须根据您的数据库架构生成DSLContext。 因此,每次更改Grails域模型时都必须执行jooq-init
命令,因为该命令将编译代码并执行所有迁移,以便在最新的数据库架构上生成最新的Java类。 由于这种方法,甚至可以从内存中的H2数据库生成结构,该数据库在应用程序关闭后将立即不可用。
在Grails上使用jOOQ的最佳实践
整合遗留数据库
您可能会遇到必须使用Grails框架连接到某些旧数据库的情况。 当然,这是可行的,但是您必须首先创建正确的Hibernate映射,或者(幸运的是)让Hibernate为您生成正确的映射。 使用此插件,您可以让jOOQ生成其Java类,并准备使用完全类型安全的DSL与数据库进行通信。
让数据库架构更改破坏代码
当您知道某些东西会早点破裂时,它是最珍贵的礼物之一。 在Grails中使用jOOQ会在编译期间发生。 当执行jooq-init
,将使用最新的数据库架构编译应用程序并重新生成Java类。 如果生成的类发生更改,将通知您代码不再能够编译。 您可以修复您的SQL语句,并确保您的应用程序在运行时不会中断。
将生成的类保留在版本控制系统中
我们建议您将jOOQ生成的类以及其他应用程序源代码检入到VCS中。 当您使用jOOQ类与数据库进行通信时,编译必须具有已定义的类。 您是否使用其他方法? 请告诉我们!
路线图
我们计划进一步简化集成,并将jooq-init
附加到常规grails编译过程中。 另外,我们还希望使我们的插件难以滥用(请参见jooqService部分 ),并增加不仅在服务或控制器中而且在普通Java类中使用jOOQ的可能性。
对UWS-jOOQ Grails-Plugin的贡献
该软件根据Apache许可证2.0版分发。 我们希望免费提供此软件,并为人们提供服务
他们整合了jOOQ和Grails。 如果您对此项目感兴趣,请随时提交问题或将请求拉到该项目的git 信息库 。
进一步阅读
以下链接提供有关UWS-jOOQ Grails-Plugin的其他信息:
- UWS-jOOQ Grails-插件
- UWS-jOOQ Grails-Plugin:文档
- UWS-jOOQ Grails-Plugin:用法示例
- UWS-jOOQ Grails-Plugin:代码库
- UWS-jOOQ Grails-Plugin:示例性集成项目
- 使用Grails框架进行软件开发
有关UWS或jOOQ的常规信息可以在这里找到: