使用Groovy和Gradle轻松进行数据库操作

分类:WEB服务     作者:     发布时间:2019-11-19

并非一切人都以为Java 编程言语很性感。可是,从最保存的企业到最乖僻的草创企业,Java 虚拟机都是无处不在的主导力量。现在,有许多可代替的言语可编译为Java字节码。有根据JVM的Python,Ruby版别和JavaScript的多种完成。有全新的言语,例如 JetBrains的Kotlin和RedHat的Ceylon。Clojure最近从头唤起了对Lisp和Scala的爱好很大程度上是2000年服务器端向功用编程的改变的原因。

Groovy是一切人的祖父,今日简直无处不在。当它在13年前初次出现时,Groovy马上遭到欢迎。该言语和相关的Grails Web结构将Ruby on Rails的新式盛行与Java开发人员的极浅学习曲线结合在一起。在简直一夜之间,Groovy彻底代替了曾经的JVM脚本代替品BeanShell。

对Rails模型的热心终究削弱了,强类型的言语再次成为趋势。坦率地说,许多只是因为它是“新的”而蜂拥至Groovy的人仍在继续开发新事物。可是,Groovy并没有消失。相反,它现已成为“企业时尚”言语的老练人物。随处可见。JVM上简直一切揭露脚本接口的应用程序都以Groovy为头号公民而这样做。Groovy是与QA十分盛行的自动化测验空间,被深深植入到Spring结构,而且是快速增长的根底摇篮构建体系。

咱们没有像曾经那样大肆宣传Groovy,可是它在Java生态体系中现已根深柢固,而且还在不断扩展。这是一个安稳,安全的挑选,为此,很简略找到人才。虽然今日有更多时尚的盛行语要放在您的简历上,可是Groovy很快就消失out尽的危险好像很小。Groovy“卓有成效”,是每个Java开发人员都应该在其东西箱中运用的十分便利的东西。

除了前史,让咱们议论一个最近的用例,它使我无法运用Groovy技术。我需要为在多种环境中运转的许多应用程序快速树立一个“键值”装备参数注册表。我想在源代码办理中将这些参数捕获为特点文件的调集。每个应用程序一个文件,嵌套在每个环境的子目录中:

…
 qa-env/
 application-a.properties
 application-b.properties
 staging-env/
 application-a.properties
 application-b.properties
…仿制代码

每当在源代码办理中提交对这些特点文件的更改时,我都期望Jenkins将其值与运转时“注册表”同步。该注册表终究可能会变成etcd或Consul和Vault之类的东西,可是咱们能够运用传统的MySQL数据库快速开端作业。

因为这些天咱们的大多数继续集成构建作业都是根据Gradle的,而且因为Gradle是Groovy本机的,因而咱们能够将这种“同步”作业烘焙到Gradle构建中。经过根据JavaExec的使命,您能够将Gradle用作Groovy应用服务器!

apply plugin: 'groovy'
repositories {
 mavenCentral
 mavenLocal
// [1] Declare a localGroovy dependency, to use 
// the Groovy library that ships with Gradle.
dependencies { 
 compile localGroovy 
 compile 
 compile 
 testCompile 
// [2] Create a task of type 'JavaExec', referencing 
// a Groovy script and any input arguments. 
task runScript { 
 description 'Run a Groovy script to sync the environment config registry with the properties files in source control'
 classpath = sourceSets.main.runtimeClasspath 
 main 'com.mypackage.SyncScript'
 args Arrays.asList.toArray 
// [3] Tell Gradle to invoke your Groovy script task. 
defaultTasks 'runScript'仿制代码

编写履行某些恣意Groovy代码的Gradle构建脚本适当简略。因为现在运转Gradle的首选办法是经过精简包装器脚本,因而无需装置Gradle,就能够直接从源代码操控存储库将此解决方案传递到任何地方。

换句话说,只需提交了源代码操控存储库,就能够使 Jenkins运转Groovy脚本。

现在,关于真实整齐的部分,Groovy“同步”脚本自身。该脚本扫描恣意数量的每个环境目录,扫描每个目录中的恣意数量的每个应用程序特点文件,并将这些特点与MySQL数据库表同步。

// Iterate through each per-environment directory
new File.eachDir { File environmentDirectory - 
 // Iterate through each per-application properties file
 environmentDirectory.eachFileMatch FileType.FILES, ~/.+\.properties/, { File applicationFile - 
 def environment = environmentDirectory.name
 def application = applicationFile.name.replace
 println "Processing properties for env: '$environment', application: '$application'"
 // Parse the file into a java.util.Properties object
 def properties = new Properties
 applicationFile.withInputStream { stream - properties.load }
}仿制代码

Java 8 Streams使这种工作在纯Java范畴变得愈加友爱和易读,可是它依然无法触及Groovy对 File等类的扩展的简略性 。该eachDir和eachFileMatch附加的办法能够很简略地经过迭代一切的目录,并扫描具有扩展名“properties“文件的。所述withInputStream办法能够协助咱们加载每个文件的内容到一个java.util.Properties与单行目标。

除了对java.io.File的扩展之外,Groovy还供给了自己的groovy.sql.Sql类来促进JDBC操作。这减少了结构数据库查询所需的许多样板,并答应咱们在闭包内处理其ResultSet:

database = groovy.sql.Sql.newInstance
database.resultSetConcurrency = ResultSet.CONCUR_UPDATABLE
// Iterate through the properties, and sync MySQL
properties.entrySet.each {
 def name = it.key
 def value = it.value
 def existingRecordQuery = '''
SELECT environment, service, property_name, property_value FROM environment_properties
WHERE environment = ? AND service = ? AND property_name = ?
 database.query { ResultSet rs - 
 if ) {
 def existingValue = rs.getString
 if ) {
 // Existing property value is unchanged. No-op.
 } else {
 // Existing property value has changed. Update.
 rs.updateString
 rs.updateRow
 } else {
 // New property. Insert.
 rs.moveToInsertRow
 rs.updateString
 rs.updateString
 rs.updateString
 rs.updateString
 rs.insertRow
// TODO: Remove from the database properties that have 
// been removed from the properties file.仿制代码

这儿发生了一些风趣的工作:

这个特定的用例十分详细,可是它展现了多个概念,这些概念在阻隔中广泛有用。Groovy是一种十分强壮的言语,在没有其他代替办法的环境中可能会遭到欢迎。它是Gradle的本机,后者已敏捷成为Java生态体系中最首要的构建东西,因而Groovy易于经过您的继续集成服务器加以使用。最终,Groovy供给了完好的类库以及对中心Java类的扩展,这些真实地消除了许多常见使命的样板和复杂性。