Groovy SQL

This section some content from this GroovySQL article, by Andrew Glover. If some of the references to JDBC don't make sense, don't worry. There is one new language construct that is used below, which is the inclusion of variables in string definitions. For example try the following:

このセクションでは、GroovySQL article, by Andrew Glover を一部引用しています。




piEstimate = 3;
println("Pi is about ${piEstimate}");   --> Pi is about 3
println("Pi is closer to ${22/7}");     --> Pi is closer to 3.1428571429

As you can see, in a string literal, Groovy interprets anything inside ${} as a groovy expression.This feature is used extensively below.

  このようにGroovyは、${}の中のものを評価します(groovy expression)。この機能を以下では、色々な所で使ってます。

Performing a simple query


Your first Groovy SQL code consists of three lines.

最初のGroove SQL のコードは3行です。

import groovy.sql.Sql
sql = Sql.newInstance("jdbc:jtds:sqlserver://serverName/dbName-CLASS;domain=domainName", "username",
                     "password", "net.sourceforge.jtds.jdbc.Driver")
sql.eachRow("select * from tableName", { println + " -- ${it.firstName} --"} );

The first line is a Java import. It simply tells Groovy the full name of the Sql object. The second line creates a new connection to the SQL database, and stores the connection in the variable sql.

最初の行はJavaのimport文です。これでGroovyはSqlオブジェクトのフルネームが分かります。 2行目は、SQLデータベースへの新しいコネクションを生成し、変数sqlにセットします。

This code is written for a jTDS connection to a MS SQL Server database. You will need to adjust all the parameters to newInstance to connect to your database, especially username and password.

ここでは、データベースがMS SQL ServerでjTDS jdbc ドライバーを使っていますので username,password を含むすべてのパラメーターを実際に使うデータベースに合わせてください。

Finally the third line calls the eachRow method of sql, passing in two arguments, the first being the query string, the second being a closure to print out some values.

最後の行では、Sql の eachRow メソッドを2つの引数で呼びます(1番目はクエリストリング、2番目は、2つの値を プリント するクロージャー)

Notice that in the closure the fields of "it" are accessed in two different ways. The first is as a simple field reference, accessing the id field of it. The second is the included Groovy expression mentioned above.values.

クロージャーの中で、"it"(result set の行を表す)のフィールドは2つの方法で指定されてます。 最初は、単純なフィールド名(カラム名)指定で、もう一つは、 フィールド名(カラム名)指定ですが上記のGroovy expressionを経由しています。

  So the output from a row might look like:


001 -- Lane --

Retrieving a single value from DB


If all you need is a value of one or a few columns of a single row in the DB, you could do this


row = sql.firstRow("select columnA, columnB from tableName")
println "Row: columnA = ${row.columnA} and columnB = ${row.columnB}"

Doing more complex queries


The previous examples are fairly simple, but GroovySql is just as solid when it comes to more complex data manipulation queries such as insert, update, and delete queries. For these, you wouldn't necessarily want to use closures, so Groovy's Sql object provides the execute and executeUpdate methods instead. These methods are reminiscent of the normal JDBC statement class, which has an execute and an executeUpdate method as well.

これまでのサンプルは、簡単なもの(照会)でしたけど、GroovySql は、insert,update,delete  といったクエリでも大丈夫です。 これらの種類のクエリでは、クロージャーを必要としない時が多いでしょうから、GroovySqlは、execute と executeUpdate メソッドを用意しています。 通常のJDBCのexecute と executeUpdateメソッドを思い浮かべますね。

Here you see a simple insert that uses variable substitution again with the ${} syntax. This code simply inserts a new row into the people table.

  insertのサンプル: peopleというテーブルに ${}を使って値の変数を置換し 新しい行を insert するサンプルです。

firstName = "yue"
lastName = "wu"
sql.execute("insert into people (firstName, lastName) "+
  " values ('${firstName}', ${lastName})")

Note that in this example you have to put quotes around any string data in the insert statement. This is generally not a great way to do things (think about what happens if your data contains a quote character). A better way to do the same thing is to use prepared statements as follows:

このサンプルでは、string型データをシングルクウォートしています。 これは、いいやり方ではないですね(そのデータがシングルクウォートを含んでいた場合を考えて見てください) 以下のようにprepared statementsを使いましょう。

firstName = "yue"
lastName = "wu"
sql.execute("insert into people (firstName, lastName) "+
  " values (?,?)", [firstName, lastName])

The data that you want to insert is replaced with "?" in the insert statement, and then the values are passed in as an array of data items. Updates are much the same in that they utilize the executeUpdate method. Notice, too, that in Listing 8 the executeUpdate method takes a list of values that will be matched to the corresponding ? elements in the query.

insert したいデータは、配列のitemとしてexecuteメソッドの2番目の引数になり、1番目の引数のinsert ステートメントの"?"達は、その配列の値でそれぞれ置換されます。 Updateも同様ですが、ここでは、executeUpdateメソッドを使ってます。 executeUpdate メソッドでも"?"を置換するリストを引数にしています。

comment = "Lazy bum"
sql.executeUpdate("update people set comment = ? where id=002", [comment])

Deletes are essentially the same as inserts, except, of course, that the query's syntax is different.


sql.execute("delete from word where word_id = ?" , [5])