GroovySqlのいいところ

GroovySqlはなかなかいいヤツです。例えばこんなかんじ

url = 'jdbc:oracle:thin:@hogefuga:1521:sid'
driver = 'oracle.jdbc.driver.OracleDriver'
user = 'scott'
password = 'tiger'

sql = Sql.newInstance( url, user, password, driver )
sql.eachRow("SELECT * FROM TABLE") { |row|  . . . . } 

このeachRow()のサポートなんて最高です。

ところで、Groovyって

"Hello, my name is ${bean.name}. i'am ${bean.age} years old"

というような文字列表現をサポートしています。これはGStringという型で実現されていて、変数の展開は、GString#toString()のタイミングで実施されます。遅延評価というかなんというか。
GroovySqlは execute()や executeUpdate()でGStringを引数に取るものがあります。例えばこんな感じ、

sql.executeUpdate("insert into table(a,b,c) values (${a},${b},${c}")

これ、普通に考えたら SQLキャッシュきかないっぽいじゃないですか。値のバリエーションごとに違うSQLが生成されますから、Oracleの場合なんかだとV$SQLAREAの結末は悲惨っぽいですよね。ところが、GStringを引数にとるGroovySqlは遅延評価の仕組みを使って

  • ${hoge} みたいなところを探す
  • これを全部 "?" に置換して PreparedStatementにする
  • で、文字列中に出てきた ${hoge} とかをバインディングしていく

という方法で実に簡単にSQLの再利用を促進してるんです。

ちょっとしたことなんですけど、これ、絶対イイです。なんかもう惚れてしまいました。