Groovy - 数据库

  • 简述

    Groovy 的 groovy-sql 模块提供了比当前 Java 的 JDBC 技术更高级的抽象。Groovy sql API 支持多种数据库,其中一些如下所示。
    • HSQLDB
    • Oracle
    • SQL Server
    • MySQL
    • MongoDB
    在我们的示例中,我们将使用 MySQL DB 作为示例。为了在 Groovy 中使用 MySQL,首先要做的是从 mysql 站点下载 MySQL jdbc jar 文件。The forMySQL的mat将在下面显示。
    
    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 文件并将该文件添加到类路径中。
    • 您已经完成了 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() 
       } 
    }
    
  • 插入操作

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

    例子

    下面的示例将在员工表中插入一条记录。代码放在 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 查询。
    Parameters
    • Gstring− 需要执行的sql 语句。
    • Closure− 处理从读取操作中获取的行的闭包语句。对结果集的每一行调用给定的闭包执行给定的 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.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”。在这里,我们将所有男性的 AGE 增加一岁。
    
    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 操作。以下是从 EMPLOYEE 中删除 AGE 大于 20 的所有记录的过程。
    
    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()