Groovy-데이터베이스

Groovy의 groovy-sql 모듈은 현재 Java의 JDBC 기술에 대해 더 높은 수준의 추상화를 제공합니다. Groovy SQL API는 다음과 같은 다양한 데이터베이스를 지원합니다.

  • HSQLDB
  • Oracle
  • SQL 서버
  • MySQL
  • MongoDB

이 예에서는 MySQL DB를 예로 사용하겠습니다. Groovy와 함께 MySQL을 사용하기 위해 가장 먼저해야 할 일은 mysql 사이트에서 MySQL jdbc jar 파일을 다운로드하는 것입니다.The forMySQL의 매트는 아래와 같습니다.

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

이 스크립트를 실행하는 동안 다음 결과가 생성됩니다.

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

작업 삽입

데이터베이스 테이블에 레코드를 만들 때 필요합니다.

다음 예제는 직원 테이블에 레코드를 삽입합니다. 코드는 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://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()
   } 
}

기준에 따라 특정 행만 선택하려는 경우를 가정하십시오. 다음 코드는 매개 변수 자리 표시자를 추가하여 값을 검색하는 방법을 보여줍니다. 위의 예제는 다음 코드와 같이 매개 변수를 받아들이도록 작성할 수도 있습니다. $ 기호는 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()
   }
}

읽기 작업

모든 데이터베이스에 대한 읽기 작업은 데이터베이스에서 유용한 정보를 가져 오는 것을 의미합니다. 데이터베이스 연결이 설정되면이 데이터베이스에 쿼리 할 준비가 된 것입니다.

읽기 작업은 SQL 클래스의 eachRow 메서드를 사용하여 수행됩니다.

통사론

eachRow(GString gstring, Closure closure)

결과 집합의 각 행과 함께 지정된 Closure를 호출하는 지정된 SQL 쿼리를 수행합니다.

Parameters

  • Gstring − 실행해야하는 SQL 문.

  • Closure− 읽기 작업에서 검색된 행을 처리하기위한 클로저 문. 결과 집합의 각 행과 함께 지정된 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://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]

업데이트 작업

모든 데이터베이스에 대한 UPDATE 작업은 데이터베이스에서 이미 사용 가능한 하나 이상의 레코드를 업데이트하는 것을 의미합니다. 다음 절차는 SEX가 'M'인 모든 레코드를 업데이트합니다. 여기에서는 모든 남성의 AGE를 1 년 늘립니다.

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

작업 삭제

데이터베이스에서 일부 레코드를 삭제하려면 DELETE 작업이 필요합니다. 다음은 AGE가 20 세 이상인 EMPLOYEE의 모든 레코드를 삭제하는 절차입니다.

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

거래 수행

트랜잭션은 데이터 일관성을 보장하는 메커니즘입니다. 거래에는 다음과 같은 네 가지 속성이 있습니다.

  • Atomicity − 거래가 완료되거나 아무 일도 일어나지 않습니다.

  • Consistency − 트랜잭션은 일관된 상태에서 시작하고 시스템을 일관된 상태로 유지해야합니다.

  • Isolation − 거래의 중간 결과는 현재 거래 외부에서 볼 수 없습니다.

  • Durability − 일단 트랜잭션이 커밋되면 시스템 장애 후에도 효과가 지속됩니다.

다음은 트랜잭션을 구현하는 방법에 대한 간단한 예입니다. 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()

커밋 작업

커밋 작업은 데이터베이스가 작업을 진행하고 데이터베이스의 모든 변경 사항을 완료하도록 지시하는 것입니다.

위의 예에서 이것은 다음 진술에 의해 달성됩니다.

sql.commit()

롤백 작업

하나 이상의 변경 사항에 만족하지 않고 해당 변경 사항을 완전히 되돌리려면 롤백 방법을 사용하십시오. 위의 예에서 이것은 다음 진술에 의해 달성됩니다.

sql.rollback()

데이터베이스 연결 해제

데이터베이스 연결을 끊으려면 close 메소드를 사용하십시오.

sql.close()