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 : changPreparedStatemtnを使うことも、当然できます(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 まで。