Groovy-database

提供:Dev Guides
移動先:案内検索

Groovy-データベース

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

  • HSQLDB
  • オラクル
  • SQLサーバー
  • MySQL *MongoDB

この例では、MySQL DBを例として使用します。 GroovyでMySQLを使用するために最初にすることは、mysqlサイトからMySQL jdbc jarファイルをダウンロードすることです。* MySQLのfor * matを以下に示します。

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/index [MySQL Basics]

次の例は、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()
   }
}

読み取り操作

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

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

構文

eachRow(GString gstring, Closure closure)

結果セットの各行で指定されたClosureを呼び出して、指定されたSQLクエリを実行します。

パラメーター

  • 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操作とは、データベースですでに使用可能な1つ以上のレコードを更新することです。 次の手順は、SEXが「M」であるすべてのレコードを更新します。 ここでは、すべての男性の年齢を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()
   }
}

トランザクションの実行

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

  • Atomicity -トランザクションが完了するか、まったく何も起こりません。
  • 一貫性-トランザクションは一貫した状態で開始し、システムを一貫した状態のままにする必要があります。
  • 分離-トランザクションの中間結果は、現在のトランザクションの外部では見えません。
  • 耐久性-トランザクションがコミットされると、システム障害が発生した後でも効果は持続します。

トランザクションを実装する方法の簡単な例を次に示します。 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()