Groovy - Cơ sở dữ liệu

Mô-đun groovy-sql của Groovy cung cấp tính trừu tượng cấp cao hơn so với công nghệ JDBC của Java hiện tại. Groovy sql API hỗ trợ nhiều loại cơ sở dữ liệu, một số cơ sở dữ liệu được hiển thị bên dưới.

  • HSQLDB
  • Oracle
  • Máy chủ SQL
  • MySQL
  • MongoDB

Trong ví dụ của chúng tôi, chúng tôi sẽ sử dụng MySQL DB làm ví dụ. Để sử dụng MySQL với Groovy, điều đầu tiên cần làm là tải xuống tệp jar MySQL jdbc từ trang web mysql.The format của MySQL sẽ được hiển thị bên dưới.

mysql-connector-java-5.1.38-bin

Sau đó, đảm bảo thêm tệp jar ở trên vào classpath trong máy trạm của bạn.

Kết nối cơ sở dữ liệu

Trước khi kết nối với cơ sở dữ liệu MySQL, hãy đảm bảo những điều sau:

  • Bạn đã tạo một cơ sở dữ liệu TESTDB.
  • Bạn đã tạo một bảng EMPLOYEE trong TESTDB.
  • Bảng này có các trường FIRST_NAME, LAST_NAME, AGE, SEX và THU NHẬP.
  • ID người dùng "testuser" và mật khẩu "test123" được đặt để truy cập TESTDB.
  • Đảm bảo bạn đã tải xuống tệp jar mysql và thêm tệp vào classpath của bạn.
  • Bạn đã xem qua hướng dẫn MySQL để hiểu Kiến thức cơ bản về MySQL

Ví dụ sau đây cho thấy cách kết nối với cơ sở dữ liệu 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()  
   } 
}

Trong khi chạy tập lệnh này, nó tạo ra kết quả sau:

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

Tạo bảng cơ sở dữ liệu

Bước tiếp theo sau khi kết nối với cơ sở dữ liệu là tạo các bảng trong cơ sở dữ liệu của chúng tôi. Ví dụ sau đây cho thấy cách tạo một bảng trong cơ sở dữ liệu bằng Groovy. Phương thức thực thi của lớp Sql được sử dụng để thực thi các câu lệnh đối với cơ sở dữ liệu.

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

Chèn hoạt động

Nó được yêu cầu khi bạn muốn tạo bản ghi của mình vào một bảng cơ sở dữ liệu.

Thí dụ

Ví dụ sau sẽ chèn một bản ghi trong bảng nhân viên. Mã được đặt trong một khối try catch để nếu bản ghi được thực thi thành công, giao dịch được cam kết với cơ sở dữ liệu. Nếu giao dịch không thành công, quá trình khôi phục được thực hiện.

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

Giả sử nếu bạn muốn chỉ chọn các hàng nhất định dựa trên một tiêu chí. Đoạn mã sau đây cho biết cách bạn có thể thêm trình giữ chỗ tham số để tìm kiếm giá trị. Ví dụ trên cũng có thể được viết để nhận các tham số như trong đoạn mã sau. Biểu tượng $ được sử dụng để xác định một tham số sau đó có thể được thay thế bằng các giá trị khi câu lệnh sql được thực thi.

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

ĐỌC hoạt động

ĐỌC Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là lấy một số thông tin hữu ích từ cơ sở dữ liệu. Khi kết nối cơ sở dữ liệu của chúng tôi được thiết lập, bạn đã sẵn sàng thực hiện truy vấn vào cơ sở dữ liệu này.

Thao tác đọc được thực hiện bằng cách sử dụng phương thức eachRow của lớp sql.

Cú pháp

eachRow(GString gstring, Closure closure)

Thực hiện truy vấn SQL đã cho gọi Closure đã cho với mỗi hàng của tập kết quả.

Parameters

  • Gstring - Câu lệnh sql cần được thực hiện.

  • Closure- Câu lệnh đóng để xử lý các hàng được lấy lại từ thao tác đọc. Thực hiện truy vấn SQL đã cho gọi Closure đã cho với mỗi hàng của tập kết quả.

Ví dụ mã sau đây cho thấy cách tìm nạp tất cả các bản ghi từ bảng nhân viên.

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

Kết quả từ chương trình trên sẽ là:

[Mac, Mohan, 20, M, 2000.0]

Cập nhật hoạt động

CẬP NHẬT Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là cập nhật một hoặc nhiều bản ghi đã có sẵn trong cơ sở dữ liệu. Quy trình sau đây cập nhật tất cả các bản ghi có SEX là 'M'. Ở đây, chúng tôi tăng TUỔI của tất cả nam giới lên một nă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()
   } 
}

Thao tác DELETE

Thao tác DELETE là bắt buộc khi bạn muốn xóa một số bản ghi khỏi cơ sở dữ liệu của mình. Sau đây là quy trình để xóa tất cả các bản ghi khỏi NHÂN VIÊN có TUỔI trên 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()
   } 
}

Thực hiện giao dịch

Giao dịch là một cơ chế đảm bảo tính nhất quán của dữ liệu. Các giao dịch có bốn thuộc tính sau:

  • Atomicity - Giao dịch hoàn tất hoặc không có gì xảy ra.

  • Consistency - Một giao dịch phải bắt đầu ở trạng thái nhất quán và để hệ thống ở trạng thái nhất quán.

  • Isolation - Kết quả trung gian của một giao dịch không được hiển thị bên ngoài giao dịch hiện tại.

  • Durability - Sau khi giao dịch được cam kết, các tác động sẽ tồn tại dai dẳng, ngay cả sau khi hệ thống bị lỗi.

Đây là một ví dụ đơn giản về cách thực hiện các giao dịch. Chúng tôi đã xem ví dụ này từ chủ đề trước của chúng tôi về hoạt động XÓA.

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

Cam kết hoạt động

Hoạt động cam kết là những gì yêu cầu cơ sở dữ liệu tiến hành trước hoạt động và hoàn thành tất cả các thay đổi đối với cơ sở dữ liệu.

Trong ví dụ trên của chúng tôi, điều này đạt được bằng câu lệnh sau:

sql.commit()

Thao tác khôi phục

Nếu bạn không hài lòng với một hoặc nhiều thay đổi và bạn muốn hoàn nguyên những thay đổi đó hoàn toàn, thì hãy sử dụng phương pháp khôi phục. Trong ví dụ trên của chúng tôi, điều này đạt được bằng câu lệnh sau:

sql.rollback()

Ngắt kết nối cơ sở dữ liệu

Để ngắt kết nối Cơ sở dữ liệu, hãy sử dụng phương pháp đóng.

sql.close()