Groovy - 資料庫



Groovy 的 groovy-sql 模組提供了比當前 Java 的 JDBC 技術更高層次的抽象。Groovy sql API 支援各種資料庫,其中一些如下所示。

  • HSQLDB
  • Oracle
  • SQL Server
  • MySQL
  • MongoDB

在我們的示例中,我們將使用 MySQL 資料庫作為示例。為了在 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 檔案並將其新增到類路徑中。
  • 您已學習 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://: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://: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://: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://: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) {
      // Creating a connection to the database
      def sql = Sql.newInstance('jdbc:mysql://: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]

更新操作

任何資料庫上的更新操作都意味著更新資料庫中已存在的 一條或多條記錄。以下過程更新所有 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://: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()
   } 
}

刪除操作

當您想從資料庫中刪除某些記錄時,需要刪除操作。以下是刪除 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://: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()
   } 
}

執行事務

事務是一種確保資料一致性的機制。事務具有以下四個屬性:

  • **原子性** - 事務要麼完成,要麼什麼也不發生。

  • **一致性** - 事務必須從一致狀態開始,並使系統保持一致狀態。

  • **隔離性** - 事務的中間結果在當前事務之外不可見。

  • **永續性** - 一旦事務提交,其效果將是持久的,即使在系統故障之後也是如此。

這是一個關於如何實現事務的簡單示例。我們已經在之前的刪除操作主題中看到了這個示例。

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()
廣告