Groovy - 数据库

Groovy 的 groovy-sql 模块提供了对当前 Java 的 JDBC 技术的更高级别的抽象。 Groovy sql API 支持多种数据库,其中一些如下所示。

  • HSQLDB
  • Oracle
  • SQL Server
  • MySQL
  • MongoDB

在我们的示例中,我们将使用 MySQL DB 作为示例。 为了在 Groovy 中使用 MySQL,首先要做的是从 mysql 站点下载 MySQL jdbc jar 文件。 MySQL的格式如下所示。

mysql-connector-java-5.1.38-bin

然后确保将上述 jar 文件添加到工作站的类路径中。


数据库连接

在连接到 MySQL 数据库之前,请确保以下几点 −

  • 您已创建数据库 TESTDB。
  • 您已在 TESTDB 中创建了一个表 EMPLOYEE。
  • 此表包含字段 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。
  • 用户 ID"testuser"和密码"test123"设置为访问 TESTDB。
  • 确保您已下载 mysql jar 文件并将该文件添加到您的 classpath 路径中。
  • 您已通过 MySQL 教程了解 MySQL 基础知识

以下示例显示了如何连接 MySQL 数据库"TESTDB"。

import java.sql.*; 
import groovy.sql.Sql 

class Example {
   static void main(String[] args) {
      // 创建到数据库的连接
      def sql = Sql.newInstance('jdbc:mysql://localhost:3306/TESTDB', 
         'testuser', 'test123', 'com.mysql.jdbc.Driver')
			
      // 执行获取数据库版本的查询 SELECT VERSION
      // 还使用 eachROW 方法从数据库中获取结果
   
      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) {
      // 创建到数据库的连接
      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() 
   } 
}

Insert 插入操作

当您想将记录创建到数据库表中时,它是必需的。

示例

以下示例将在员工表中插入一条记录。 代码被放置在一个 try catch 块中,这样如果记录成功执行,事务就会提交到数据库。 如果事务失败,则完成回滚。

import java.sql.*; 
import groovy.sql.Sql 

class Example {
   static void main(String[] args) { 
      // 创建到数据库的连接
      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) {
      // 创建到数据库的连接
      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()
   }
}

读操作

对任何数据库的读操作意味着从数据库中获取一些有用的信息。 建立数据库连接后,您就可以对这个数据库进行查询了。

使用sql类的eachRow方法进行读操作。

语法

eachRow(GString gstring, Closure closure) 

对结果集的每一行调用给定的闭包执行给定的 SQL 查询。

参数

  • Gstring − 需要执行的sql语句。

  • Closure − 用于处理从读取操作中检索到的行的闭包语句。 对结果集的每一行调用给定的闭包执行给定的 SQL 查询。

下面的代码示例显示了如何从员工表中获取所有记录。

import java.sql.*; 
import groovy.sql.Sql
 
class Example {
   static void main(String[] args) {
      // 创建到数据库的连接
      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 更新操作

UPDATE 对任何数据库的操作意味着更新数据库中已经存在的一条或多条记录。 以下过程更新所有 SEX 为"M"的记录。 在这里,我们将所有男性的 AGE 增加一年。

import java.sql.*; 
import groovy.sql.Sql 

class Example {
   static void main(String[] args){
      // 创建到数据库的连接
      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 删除操作

当您想从数据库中删除一些记录时,需要执行 DELETE 操作。 以下是从 EMPLOYEE 中删除 AGE 大于 20 的所有记录的过程。

import java.sql.*; 
import groovy.sql.Sql 

class Example {
   static void main(String[] args) {
      // 创建到数据库的连接
      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()
   } 
}

执行事务

事务是一种确保数据一致性的机制。 事务具有以下四个属性 −

  • Atomicity − 要么事务完成,要么什么都没有发生。

  • Consistency − 事务必须以一致的状态开始,并使系统保持一致的状态。

  • Isolation − 事务的中间结果在当前事务之外是不可见的。

  • Durability − 事务一旦提交,效果就会持续存在,即使在系统发生故障之后也是如此。

这是一个如何实现事务的简单示例。 我们已经从我们之前的 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()