Groovy的groovy-sql模塊提供了比當(dāng)前Java的JDBC技術(shù)更高級的抽象。Groovy sql API支持各種各樣的數(shù)據(jù)庫,其中一些如下所示。
在我們的示例中,我們將使用MySQL DB作為示例。為了使用MySQL與Groovy,首先要做的是從mysql站點(diǎn)下載MySQL jdbc jar文件。 MySQL的格式如下所示。
mysql-connector-java-5.1.38-bin
然后,確保將上述jar文件添加到工作站中的類路徑。
在連接到MySQL數(shù)據(jù)庫之前,請確保以下內(nèi)容 -
下面的示例顯示如何連接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.
連接到數(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() } }
事務(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ù)庫連接,使用Close方法。
sql.close()
更多建議: