数据库(Database)

优质
小牛编辑
136浏览
2023-12-01

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

  • HSQLDB
  • Oracle
  • SQL Server
  • MySQL
  • MongoDB

在我们的示例中,我们将使用MySQL DB作为示例。 为了将MySQL与Groovy一起使用,首先要做的是从mysql站点下载MySQL jdbc jar文件。 MySQL的问题将在下面显示。

mysql-connector-java-5.1.38-bin

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

数据库连接 (Database Connection)

在连接MySQL数据库之前,请确保以下内容 -

  • 您已经创建了一个数据库TESTDB。
  • 您已在TESTDB中创建了一个表EMPLOYEE。
  • 此表包含FIRST_NAME,LAST_NAME,AGE,SEX和INCOME字段。
  • 用户ID“testuser”和密码“test123”设置为访问TESTDB。
  • 确保已下载mysql jar文件并将该文件添加到类路径中。
  • 您已经通过MySQL教程来了解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() 
   } 
}

插入操作 (Insert Operation)

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

例子 (Example)

以下示例将在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 Operation)

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

通过使用sql类的eachRow方法执行读取操作。

语法 (Syntax)

eachRow(GString gstring, Closure closure) 

执行给定的SQL查询,使用结果集的每一行调用给定的Closure。

Parameters

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

  • Closure - 用于处理从读取操作中恢复的行的closure语句。 执行给定的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 Operation)

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()
   } 
}

执行事务 (Performing Transactions)

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

  • 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()

提交操作 (Commit Operation)

提交操作告诉数据库继续执行操作并最终完成对数据库的所有更改。

在上面的例子中,这是通过以下声明实现的 -

sql.commit()

回滚操作 (Rollback Operation)

如果您对一个或多个更改不满意并且想要完全还原这些更改,请使用回滚方法。 在上面的例子中,这是通过以下声明实现的 -

sql.rollback()

断开数据库连接

要断开数据库连接,请使用close方法。

sql.close()