📅  最后修改于: 2020-11-04 06:50:01             🧑  作者: Mango
Groovy的groovy-sql模块在当前Java的JDBC技术上提供了更高层次的抽象。 Groovy sql API支持多种数据库,其中一些如下所示。
在我们的示例中,我们将以MySQL DB为例。为了将MySQL与Groovy一起使用,首先要做的是从mysql站点下载MySQL jdbc jar文件。 MySQL的for mat将在下面显示。
mysql-connector-java-5.1.38-bin
然后确保将上述jar文件添加到工作站的类路径中。
连接到MySQL数据库之前,请确保以下内容-
以下示例显示了如何与MySQL数据库“ TESTDB”连接。
import java.sql.*;
import groovy.sql.Sql
class Example {
static void main(String[] args) {
// Creating a connection to the database
def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB',
'testuser', 'test123', 'com.mysql.jdbc.Driver')
// Executing the query SELECT VERSION which gets the version of the database
// Also using the eachROW method to fetch the result from the database
sql.eachRow('SELECT VERSION()'){ row ->
println row[0]
}
sql.close()
}
}
运行此脚本时,它产生以下结果-
5.7.10-log
The Sql.newInstance method is used to establish a connection to the database.
连接到数据库后的下一步是在我们的数据库中创建表。下面的示例演示如何使用Groovy在数据库中创建表。 Sql类的execute方法用于对数据库执行语句。
import java.sql.*;
import groovy.sql.Sql
class Example {
static void main(String[] args) {
// Creating a connection to the database
def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser',
'test123', 'com.mysql.jdbc.Driver')
def sqlstr = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
sql.execute(sqlstr);
sql.close()
}
}
要在数据库表中创建记录时需要它。
下面的示例将在employee表中插入一条记录。该代码放在try catch块中,以便如果成功执行记录,则事务将提交到数据库。如果事务失败,则回滚完成。
import java.sql.*;
import groovy.sql.Sql
class Example {
static void main(String[] args) {
// Creating a connection to the database
def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser',
'test123', 'com.mysql.jdbc.Driver')
sql.connection.autoCommit = false
def sqlstr = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try {
sql.execute(sqlstr);
sql.commit()
println("Successfully committed")
}catch(Exception ex) {
sql.rollback()
println("Transaction rollback")
}
sql.close()
}
}
假设您只想根据条件选择某些行。以下代码显示了如何添加参数占位符以搜索值。上面的示例也可以编写为采用以下代码中所示的参数。 $符号用于定义一个参数,然后在执行sql语句时可以将其替换为值。
import java.sql.*;
import groovy.sql.Sql
class Example {
static void main(String[] args) {
// Creating a connection to the database
def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser',
'test123', 'com.mysql.jdbc.Driver')
sql.connection.autoCommit = false
def firstname = "Mac"
def lastname ="Mohan"
def age = 20
def sex = "M"
def income = 2000
def sqlstr = "INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME, AGE, SEX,
INCOME) VALUES " + "(${firstname}, ${lastname}, ${age}, ${sex}, ${income} )"
try {
sql.execute(sqlstr);
sql.commit()
println("Successfully committed")
} catch(Exception ex) {
sql.rollback()
println("Transaction rollback")
}
sql.close()
}
}
任何数据库上的READ操作意味着要从数据库中获取一些有用的信息。建立我们的数据库连接后,即可准备对该数据库进行查询。
读取操作通过使用sql类的eachRow方法执行。
eachRow(GString gstring, Closure closure)
对结果集的每一行执行给定的SQL查询,并调用给定的Closure。
参量
Gstring-需要执行的sql语句。
封闭-封闭的语句来处理来自读操作retrived行。对结果集的每一行执行给定的SQL查询,并调用给定的Closure。
下面的代码示例演示如何从employee表中获取所有记录。
import java.sql.*;
import groovy.sql.Sql
class Example {
static void main(String[] args) {
// Creating a connection to the database
def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser',
'test123', 'com.mysql.jdbc.Driver')
sql.eachRow('select * from employee') {
tp ->
println([tp.FIRST_NAME,tp.LAST_NAME,tp.age,tp.sex,tp.INCOME])
}
sql.close()
}
}
上述程序的输出将是-
[Mac, Mohan, 20, M, 2000.0]
UPDATE对任何数据库的操作意味着更新一个或多个记录,这些记录已经在数据库中可用。以下过程更新所有SEX为’M’的记录。在这里,我们将所有男性的年龄提高了一年。
import java.sql.*;
import groovy.sql.Sql
class Example {
static void main(String[] args){
// Creating a connection to the database
def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser',
'test@123', 'com.mysql.jdbc.Driver')
sql.connection.autoCommit = false
def sqlstr = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = 'M'"
try {
sql.execute(sqlstr);
sql.commit()
println("Successfully committed")
}catch(Exception ex) {
sql.rollback()
println("Transaction rollback")
}
sql.close()
}
}
要从数据库中删除某些记录时,需要执行DELETE操作。以下是从AGE大于20的EMPLOYEE中删除所有记录的过程。
import java.sql.*;
import groovy.sql.Sql
class Example {
static void main(String[] args) {
// Creating a connection to the database
def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 'testuser',
'test@123', 'com.mysql.jdbc.Driver')
sql.connection.autoCommit = false
def sqlstr = "DELETE FROM EMPLOYEE WHERE AGE > 20"
try {
sql.execute(sqlstr);
sql.commit()
println("Successfully committed")
}catch(Exception ex) {
sql.rollback()
println("Transaction rollback")
}
sql.close()
}
}
事务是一种确保数据一致性的机制。事务具有以下四个属性-
原子性-事务完成还是什么都没有发生。
一致性-事务必须以一致状态开始,并使系统保持一致状态。
隔离-交易的中间结果在当前交易之外不可见。
持久性-提交事务后,即使在系统出现故障后,效果也将持久。
这是有关如何实现交易的简单示例。我们已经从上一个DELETE操作主题中看到了这个示例。
def sqlstr = "DELETE FROM EMPLOYEE WHERE AGE > 20"
try {
sql.execute(sqlstr);
sql.commit()
println("Successfully committed")
}catch(Exception ex) {
sql.rollback()
println("Transaction rollback")
}
sql.close()
提交操作告诉数据库继续进行操作并完成对数据库的所有更改。
在我们上面的示例中,这是通过以下语句实现的:
sql.commit()
如果您对一项或多项更改不满意,并且想要完全还原这些更改,请使用回滚方法。在我们上面的示例中,这是通过以下语句实现的:
sql.rollback()
要断开数据库连接,请使用close方法。
sql.close()