1 Groovy介绍
1.1 Groovy介绍
Groovy是一种编程语言,它结合了Java的强大功能和脚本语言的简洁性。它具有动态类型、易读的语法、与Java的紧密集成、脚本编程能力、强大的闭包等特点。
1.2 Groovy SQL介绍
Groovy SQL是 Groovy 编程语言的一部分,用于简化与数据库的交互。它提供了一种更易用的方式来执行 SQL 查询和操作数据库,允许开发者使用 Groovy 的简洁语法进行数据库操作,而无需编写繁琐的JDBC 代码。Groovy SQL 支持动态类型、内置数据库连接池、参数化査询、自动结果集处理和异常处理简化等特性,使数据库操作更加方便和高效。这使得 Groovy SQL成为在 Groovy 项目中处理数据库任务的有力工具。
2 环境准备
-
Java Development Kit (JDK):你需要安装适当版本的JavaJDK,建议使用JDK8或更高版本。Groovy在 Java 平台上运行,因此需要 Java 环境。
-
Groovy 安装:你需要安装 Groovy。你可以通过 SDKMAN 或官方网站下载并安装 Groovy。确保将Groovy 的二进制文件路径添加到系统的环境变量中。
-
操作系统支持:Groovy 可以在多种操作系统上运行,包括Windows、macOS 和各种 Linux 发行版
-
内存和处理器要求:要顺利运行 Groovy 环境,系统需要有足够的内存和处理器资源。确保系统满足Groovy 运行的最低硬件要求。
Groovy下载: JFrog
解压:
配置环境变量(同jdk):
注意:安装Groovy需要安装jdk并配置好jdk的环境变量,如果不安装jdk就会出现以下问题
ERROR: No java.exe found at: C:\Program Files\Java\jdk1.8.0_131\bin\java.exe
Please set the JAVA_HOME variable in your environment
to match the location of your Java installation.
查看安装是否成功与安装的版本
3 Groovy基本语法
3.1 变量和数据类型
-
定义变量时不需要显式声明类型,Groovy 会自动推断。(弱类型)
-
支持基本数据类型(整数、浮点数、布尔值)、字符串和列表等数据类型。
def name = "Alice"
def name = """Alice""”
def age = 30
3.2 控制流
-
支持条件语句(if、else if、else)、循环(for、while)
-
与 Java 类似的控制流语法。
使用if判断:
if(age < 18){
println("未成年")
} else {
println("成年")
}
使用for循环:
//使用 for 循环遍历一个整数范围
for(int i in 1..5){
println("iteration: $i")
}
// 使用 for 循环遍历列表
def colors =['red','green', 'blue']
for(color in colors){
println("color: $color")
}
// 使用 for 循环遍历列表
def persons =[name:'Alice', age: 30]
for(person in persons){
println("key: $person.key")
println("value: $person.value")
}
使用while循环:
def count = 0
while(count < 5){
println("Count: $count")
count++
}
//使用 do-while 循环
count =0
do {
println("Count: $count")
count++
} while(count<5)
3.3 字符串处理
- 使用双引号定义字符串,支持字符串插值
- 使用GString可以在字符串中嵌入变量
def name = "Alice"
def greeting = "Hello, $name!"
//输出 Hello,Alice!
3.4 列表和映射
- 支持列表(List)和映射(Map)的定义和操作
def colors = ['red','green','blue']
def person = [name: 'Alice',age: 30]
3.5 方法和闭包
-
定义方法时使用 def 关键字,
-
支持闭包,可以将函数赋值给变量或作为参数传递。
def greet(name){
return "Hello, $name!"
}
def add = { a, b ->a+ b }
// 调用
greet(‘小明’);
add(1,3);
3.6 类和对象
- 创建类时使用class关键字
- 使用new关键字创建对象
- Groovy支持属性(不需要显式的getter和setter方法)
class Person {
def name
def age
}
def person = new Person(name: "Alice", age: 30)
// 获取属性
println person.name;
println person.age;
3.7 异常处理
- 使用 try-catch 块捕获异常。
- 异常处理与 Java 类似。
try {
//可能会抛出异常的代码
} catch(Exception e){
// 异常处理代码
}
3.8 导入库
- 使用import关键字导入其他类或库
import java.util.ArrayList;
3.9 JSON处理
- 使用JsonBuilder和JsonSlurper
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
def data = ["res_code": "2999","res_desc": "fail!"];
// JSON字符串
def str = new JsonBuilder(data).tostring();
println str;
// JSON对象
def json = new JsonSlurper().parseText(str);
println json;
4 Groovy SQL调用方式
Groovy SQL 提供了一种简洁而强大的方式来执行 SQL 查询和与数据库交互。以下是 Groovy SQL 的基本语法和用法:
4.1 导入库
首先,需要导入Groovy SQL相关的库,通常使用groovy.sql.Sql;
import groovy.sql.Sql
4.2 创建数据库连接
使用Sql类创建数据库连接,并指定数据库的连接信息:
@Grab(group='org.codehaus.groovy.modules', module='groovy-sql', version='3.41.0')
import groovy.sql.Sql
def url = 'jdbc:mysql://localhost:3306/mydatabase'
def user = 'your_username'
def password = 'your_password'
//使用Sql类创建数据库连接,并指定数据库的连接信息:
def db = Sql.newInstance(url, user, password, 'com.mysql.cj.jdbc.Driver')
db.eachRow('SELECT * FROM my_table') { row ->
println "Column 1: ${row.column1}, Column 2: ${row.column2}"
}
db.close()
4.3 执行查询
使用eachRow、firstRow或rows方法执行查询,处理查询结果:
//定义变量,变量值为执行的sq1
def selectSql ="SELECT * FROM My_Table";
//获取这么定义,区别:使用三个引号定义的变量是可以换行的
def selectSql="""SELECT *
FROM My_Table""";
// 类似存储过程中的for-loop,cc代表查询的每一行
db.eachRow(selectsql,{
CC ->
// 输出cc的内容
println cc;
});
// 返回第一行,默认加了rownum =1
def result=db.firstRow(selectsql);
// 返回查询结果为一个集合
def list = db.rows(selectsql);
4.4 参数化查询
可以进行参数化查询,防止SQL注入:
//定义变量,变量值为执行的sq1
def selecSql = "SELECT * FROM My_Table WHERE NAME = ? AND AGE = ?",
//类似存储过程中的for-1oop,cc代表查询的每一行
db.eachRow(selectsql,["小明","12"],{
CC ->
// 输出cc的内容
println cc;
});
//返回第一行,默认加了rownum=1
def result = db.firstRow(selectSql,["小白","15"]);
//返回查询结果为一个集合
def list = db.rows(selectSql,["小陈","12"]);
4.5 插入数据
执行插入数据的操作:
//定义变量,变量值为执行的sq1
def insertSql = "INSERT INTO My_Table (ID,NAME,AGE) VALUES (?,?,?);"
// 插入数据
db.executeInsert(insertSql,[1,"小白",12]);
/ 或者
db.execute(insertSql,[1,"小白",12]);
4.6 更新数据
执行更新数据的操作:
//定义变量,变量值为执行的sq1
def updateSql = "UPDATE My_Table T SET T.ID = '1’ WHERE T.NAME = ? AND T.AGE = ?"
// 更新数据
tbcsa.executeUpdate(updateSql,["小白","11"]);
// 或者
tbcsa.execute(updateSql,["小李","13"]);
4.7 删除数据
//定义变量,变量值为执行的sq1
def deleteSql = "DELETE FROM My_Table T WHERE T.ID = ? AND T.NAME = ?",
// 删除数据
db.executeUpdate(deleteSql,["1","小白"]);
//或者
db.execute(deleteSql,["1","小李"]);
4.8 调用存储过程
在Groovy中调用存储过程可以通过Sql库实现。下面是一个简单的示例代码,演示如何连接到数据库并调用存储过程:
groovyCopy Code@Grab(group='org.codehaus.groovy.modules', module='groovy-sql', version='3.41.0')
import groovy.sql.Sql
def url = 'jdbc:mysql://localhost:3306/mydatabase'
def user = 'your_username'
def password = 'your_password'
def sql = Sql.newInstance(url, user, password, 'com.mysql.cj.jdbc.Driver')
def callStoredProcedure = "{call my_stored_procedure(?,?)}"
def params = [param1Value, param2Value] // 传递给存储过程的参数值
sql.withTransaction {
sql.call(callStoredProcedure, params) { result ->
result.each { row ->
println row
}
}
}
sql.close()
在上面的代码中:
- 替换
jdbc:mysql://localhost:3306/mydatabase
、your_username
和your_password
为你的数据库连接信息。 com.mysql.cj.jdbc.Driver
是 MySQL 数据库的驱动程序,如果你使用其他数据库,需要替换为相应的驱动程序类名。my_stored_procedure
是你要调用的存储过程名称,可以根据实际情况进行修改。param1Value
和param2Value
是传递给存储过程的参数值,根据存储过程定义进行设置。withTransaction
方法用于确保在执行存储过程时开启事务,并在代码块执行完毕后自动提交事务或回滚。
4.9 批处理
在Groovy中,你可以使用Sql库来执行批处理SQL语句。下面是一个简单的示例代码,演示如何通过Groovy的Sql库执行批处理:
groovyCopy Code@Grab(group='org.codehaus.groovy.modules', module='groovy-sql', version='3.41.0')
import groovy.sql.Sql
def url = 'jdbc:mysql://localhost:3306/mydatabase'
def user = 'your_username'
def password = 'your_password'
def sql = Sql.newInstance(url, user, password, 'com.mysql.cj.jdbc.Driver')
sql.withBatch { batch ->
batch.addBatch("INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2')")
batch.addBatch("UPDATE my_table SET column1 = 'new_value' WHERE column2 = 'some_value'")
batch.addBatch("DELETE FROM my_table WHERE column1 = 'old_value'")
int[] updateCounts = batch.executeBatch()
println "Updated ${updateCounts.sum()} rows"
}
sql.close()
在上面的代码中:
- 替换
jdbc:mysql://localhost:3306/mydatabase
、your_username
和your_password
为你的数据库连接信息。 com.mysql.cj.jdbc.Driver
是 MySQL 数据库的驱动程序,如果你使用其他数据库,需要替换为相应的驱动程序类名。- 在
withBatch
闭包中,你可以使用addBatch
方法来添加要执行的SQL语句。 executeBatch
方法用于执行批处理中的所有SQL语句,并返回更新计数数组。
4.10 事务提交
db.commit();
4.11 关闭连接
db.close();
5 执行命令
- 执行
groovy test.groovy
- 执行带参数
groovy test.groovy param1 param2
- 指定编码
groovy --encoding=GBK test.groovy
//或
groovy -Dfile.encoding=GBK test.groovy
- 指定堆内存大小
export JAVA_0PTS="-Xms256m -Xmx1024m
groovy test.groovy