Groovy-データベース

Groovyのgroovy-sqlモジュールは、現在のJavaのJDBCテクノロジーを超える高レベルの抽象化を提供します。Groovy sql APIは、さまざまなデータベースをサポートしています。その一部を以下に示します。

  • HSQLDB
  • Oracle
  • SQLサーバー
  • MySQL
  • MongoDB

この例では、例としてMySQLDBを使用します。GroovyでMySQLを使用するには、最初にmysqlサイトからMySQL jdbcjarファイルをダウンロードします。The forMySQLのマットを以下に示します。

mysql-connector-java-5.1.38-bin

次に、上記のjarファイルをワークステーションのクラスパスに追加してください。

データベース接続

MySQLデータベースに接続する前に、次のことを確認してください。

  • データベースTESTDBを作成しました。
  • TESTDBにテーブルEMPLOYEEを作成しました。
  • このテーブルには、フィールドFIRST_NAME、LAST_NAME、AGE、SEX、およびINCOMEがあります。
  • TESTDBにアクセスするためのユーザーID「testuser」とパスワード「test123」が設定されています。
  • 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() 
   } 
}

挿入操作

レコードをデータベーステーブルに作成する場合に必要です。

次の例では、employeeテーブルにレコードを挿入します。コードはtrycatchブロックに配置されるため、レコードが正常に実行された場合、トランザクションはデータベースにコミットされます。トランザクションが失敗した場合、ロールバックが実行されます。

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

READ操作

任意のデータベースでのREAD操作は、データベースからいくつかの有用な情報をフェッチすることを意味します。データベース接続が確立されると、このデータベースにクエリを実行する準備が整います。

読み取り操作は、SQLクラスのeachRowメソッドを使用して実行されます。

構文

eachRow(GString gstring, Closure closure)

結果セットの各行で指定されたクロージャーを呼び出す指定されたSQLクエリを実行します。

Parameters

  • Gstring −実行する必要のあるSQLステートメント。

  • Closure−読み取り操作から取得された行を処理するためのクロージャーステートメント。結果セットの各行で指定されたクロージャーを呼び出す指定されたSQLクエリを実行します。

次のコード例は、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', 
         '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任意のデータベースでの操作とは、データベースですでに使用可能な1つ以上のレコードを更新することを意味します。次の手順では、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操作

データベースから一部のレコードを削除する場合は、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()
   } 
}

トランザクションの実行

トランザクションは、データの整合性を保証するメカニズムです。トランザクションには次の4つのプロパティがあります-

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

ロールバック操作

1つ以上の変更に満足できず、それらの変更を完全に元に戻したい場合は、ロールバック方式を使用してください。上記の例では、これは次のステートメントによって実現されます。

sql.rollback()

データベースの切断

データベース接続を切断するには、closeメソッドを使用します。

sql.close()