Groovy 數(shù)據(jù)庫

2022-07-21 11:31 更新

Groovy的groovy-sql模塊提供了比當(dāng)前Java的JDBC技術(shù)更高級的抽象。Groovy sql API支持各種各樣的數(shù)據(jù)庫,其中一些如下所示。

  • HSQLDB
  • Oracle
  • SQL Server
  • MySQL
  • MongoDB

在我們的示例中,我們將使用MySQL DB作為示例。為了使用MySQL與Groovy,首先要做的是從mysql站點(diǎn)下載MySQL jdbc jar文件。 MySQL的格式如下所示。

mysql-connector-java-5.1.38-bin

然后,確保將上述jar文件添加到工作站中的類路徑。

數(shù)據(jù)庫連接

在連接到MySQL數(shù)據(jù)庫之前,請確保以下內(nèi)容 -

  • 你已經(jīng)創(chuàng)建了一個數(shù)據(jù)庫TESTDB。
  • 您在TESTDB中創(chuàng)建了一個表EMPLOYEE。
  • 此表格包含F(xiàn)IRST_NAME,LAST_NAME,AGE,SEX和INCOME。
  • 用戶ID“testuser”和密碼“test123”設(shè)置為訪問TESTDB。
  • 確保已下載mysql jar文件并將該文件添加到類路徑。
  • 你已經(jīng)通過MySQL教程來了解MySQL基礎(chǔ)

下面的示例顯示如何連接MySQL數(shù)據(jù)庫“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()  
   } 
} 

運(yùn)行此腳本時,會產(chǎn)生以下結(jié)果 -

5.7.10-log 
The Sql.newInstance method is used to establish a connection to the database.

創(chuàng)建數(shù)據(jù)庫表

連接到數(shù)據(jù)庫后的下一步是在數(shù)據(jù)庫中創(chuàng)建表。以下示例顯示如何使用Groovy在數(shù)據(jù)庫中創(chuàng)建表。Sql類的execute方法用于對數(shù)據(jù)庫執(zhí)行語句。

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

插入操作

當(dāng)您要將記錄創(chuàng)建到數(shù)據(jù)庫表中時需要。

例子

以下示例將在employee表中插入一條記錄。代碼放置在try catch塊中,因此如果記錄成功執(zhí)行,事務(wù)將提交到數(shù)據(jù)庫。如果事務(wù)失敗,則執(zhí)行回滾。

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

假設(shè)您只想根據(jù)條件選擇某些行。以下代碼顯示如何添加參數(shù)占位符以搜索值。上面的例子也可以寫成參數(shù),如下面的代碼所示。 $符號用于定義一個參數(shù),然后可以在執(zhí)行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()
   }
}

讀操作

讀操作上的任何數(shù)據(jù)庫是指從數(shù)據(jù)庫中獲取一些有用的信息。一旦我們的數(shù)據(jù)庫建立連接,您就可以進(jìn)行查詢到這個數(shù)據(jù)庫中。

讀出操作是通過使用SQL類的eachRow方法進(jìn)行。

句法

eachRow(GString gstring, Closure closure) 

執(zhí)行給定的SQL查詢調(diào)用,結(jié)果集的每一行給出閉幕。

參數(shù)

  • GString的 -這需要執(zhí)行的SQL語句。

  • 封閉 -封閉語句來處理來自讀操作retrived行。執(zhí)行給定的SQL查詢調(diào)用,結(jié)果集的每一行給出閉幕。

下面的代碼示例演示了如何來從雇員表中的所有記錄。

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]

更新操作

任何數(shù)據(jù)庫上進(jìn)行更新操作手段來更新一個或多個記錄,這已經(jīng)在數(shù)據(jù)庫中。下面的過程更新過性別為“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()
   } 
}

刪除操作

當(dāng)你想從數(shù)據(jù)庫中刪除一些記錄DELETE操作是必需的。以下是從哪里EMPLOYEE年齡超過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()
   } 
}

執(zhí)行事務(wù)

事務(wù)是確保數(shù)據(jù)一致性的機(jī)制。交易有以下四個屬性 -

  • 原子性 -事務(wù)完成或根本沒有任何事情發(fā)生。

  • 一致性 -事務(wù)必須以一致的狀態(tài)開始,并使系統(tǒng)保持一致狀態(tài)。

  • 隔離 -事務(wù)的中間結(jié)果在當(dāng)前事務(wù)外部不可見。

  • 持久性 -一旦事務(wù)提交,即使系統(tǒng)發(fā)生故障,影響仍然持續(xù)。

這里是一個如何實(shí)現(xiàn)事務(wù)的簡單示例。我們已經(jīng)從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()

提交操作

提交操作是告訴數(shù)據(jù)庫繼續(xù)操作并完成對數(shù)據(jù)庫的所有更改。

在我們的上述例子中,這是通過下面的語句實(shí)現(xiàn) -

sql.commit()

回滾操作

如果您對一個或多個更改不滿意,并希望完全還原這些更改,請使用回滾方法。在我們上面的例子中,這是通過以下語句實(shí)現(xiàn)的:

sql.rollback()

斷開數(shù)據(jù)庫

要斷開數(shù)據(jù)庫連接,使用Close方法。

sql.close()
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號