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