Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Groovy SQL


Excerpt
hiddentrue

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 を一部引用しています。
Excerpt
hiddentrue

JDBCの部分で少し分からなくも、気にしないでください。<--この文は不要と思います



また、Groovyのstringリテラルの中に変数を取り込む機能を使っています。
例:

Excerpt
hiddentrue

実行結果を追記

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

Excerpt
hiddentrue

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)。この機能を以下では、色々な所で使ってます。

Excerpt
hiddentrue

Performing a simple query

簡単なクエリ(照会)


Excerpt
hiddentrue

Your first Groovy SQL code consists of three lines.

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

Code Block
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.id + " -- ${it.firstName} --"} );

Excerpt
hiddentrue

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にセットします。
Excerpt
hiddentrue

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 を含むすべてのパラメーターを実際に使うデータベースに合わせてください。
Excerpt
hiddentrue

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つの値を プリント するクロージャー)
Excerpt
hiddentrue

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を経由しています。
Excerpt
hiddentrue

  So the output from a row might look like:


実行結果: 

Code Block
001 -- Lane --

Excerpt
hiddentrue

Retrieving a single value from DB

DBから先頭行の値を取り出す

Excerpt
hiddentrue

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


DBの先頭行のカラムの値を知りたいだけなら:

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

Excerpt
hiddentrue

Doing more complex queries

複雑なクエリー(更新)

Excerpt
hiddentrue

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メソッドを思い浮かべますね。
Excerpt
hiddentrue

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 するサンプルです。


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

Excerpt
hiddentrue

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を使いましょう。

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

Excerpt
hiddentrue

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 メソッドでも"?"を置換するリストを引数にしています。

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

Excerpt
hiddentrue

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


deleteもクエリ文が違うだけで同じです:

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