Groovy > データベースアクセス

更新日 2013-10-26
広告
Groovy (version 2.x)でデータベースにアクセスする方法を紹介します。 データベースとしてMySQLを想定します。データベース名は 'test' とします。'human' というテーブルを用意しておきます。
mysql> create table human (
    -> age int,
    -> name text
    -> );
Query OK, 0 rows affected (0.18 sec)

mysql> describe human;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| age   | int(11) | YES  |     | NULL    |       |
| name  | text    | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

INSERT

データを追加する例を示します。
import groovy.sql.Sql

def sql = Sql.newInstance('jdbc:mysql://localhost/test', 'root', 'password', 'com.mysql.jdbc.Driver')
sql.execute("insert into human (age, name) values ('30', 'takashi')")
sql.close()
Sqlインスタンスを生成するには、1)URL、2)DBのユーザ名、3)パスワード、4)ドライバクラスを引数に指定する必要があります。URLの'localhost'の部分は、DBが稼働しているサーバのホスト名もしくはIPアドレスです。'test'の部分は、データベースの名前を指定します。 上記のサンプルを実行すると、データを追加できます。
mysql> select * from human;
+------+-------+
| age  | name  |
+------+-------+
|   30 | takashi |
+------+-------+
1 row in set (0.00 sec)
executeメソッドは、文字列を引数に取るだけなので、以下のようにしてもよいです。
def age = 30
def name = "takashi"
sql.execute( "insert into human (age, name) values (${age}, ${name})" )
PreparedStatementを使うなら、以下のようにします。
def age = 30
def name = "takashi"
sql.execute( "insert into human (age, name) values (?, ?)", [age, name])

'create table .. 'などの文字列を渡せば、テーブルを作ることもできます。

sql.executeの代わりにsql.executeInsertを使うと、インサートしたレコードを、返り値として取得できます。 データベースがIDを自動インクリメントするような場合に、executeInsertを使えば、インクリメントされたIDを取得できます。

DELETE

データを削除する場合は executeUpdate を使います。
int num = sql.executeUpdate("delete from test_table")
println("delete ${num} records of test_table.")

SELECT

テーブルからデータを取得する例(Select.groovy)を示します。
import groovy.sql.Sql

sql = Sql.newInstance('jdbc:mysql://localhost/test', 'root', 'password', 'com.mysql.jdbc.Driver')

sql.eachRow("select * from human") { 
  println "${it.age} : ${it.name}"
}
sql.close()
これを実行すると、以下のようになります。
$ groovy -cp mysql-connector-java-5.0.jar Select.groovy 
30 : takashi
15 : ken
20 : tom
25 : chang
PreparedStatemtnを使うことも、当然できます(Select2.groovy)。
def age = 20
sql.eachRow("select * from human where age>?", [age]) { 
  println "${it.age} : ${it.name}"
}
以下のようになります。
$ groovy -cp mysql-connector-java-5.0.jar Select2.groovy 
30 : takashi
25 : chang
一度変数に格納するなら、eachRowじゃなくてrowsを使います。
def age = 20
def results = sql.rows("select * from human where age>?", [age])
results.each { 
  println "${it.age} : ${it.name}"
}
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system