[clubdb2] 「第158回 Javaプログラマーに贈る:Groovyで楽
最近Groovyにハマってる&殆どDB触ったこと無いから今年はDBやらなきゃと思ってる。
という想いから、なかなかドンピシャな会があったので参加してみた。
参加者は20人ぐらい?
内、Groovy触ったことあるのは自分含め3人。
JDBCプログラミングの憂鬱
- 書く量が多い ...
- 例外が面倒 ...
JavaでJDBC書くのは面倒ですよねって話。
自分もJDBCはサンプルレベルでしか触ったことないけど、
普通の「Java書くのだるい」より一つ上のレベルの面倒臭さだったという印象。
JDBCで面倒なのは記述だけでなく、
- DBの型定義を意識しなくてはいけない
- finallyで順にリソースをクローズしなくてはいけない
- SQL実行してResultSet取って来れても、結果をBeansに詰めるのが面倒
- DB内で起こったエラーは軽いものも重大なものもSQLException
- 後は開発者任せ
- しかもチェック例外
- しかも使うDBに応じて対応する必要がある
想像しただけで発狂しそう…。
ココらへんの面倒がGroovyだと解消されますよって話。
Groovyで楽をしよう
- Groovy超入門
- Javaとの連係
ココらへんは「プログラミングGroovy」に載ってる話。
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (155件) を見る
Groovyの細かい話は上の書籍を読めば済む話なので、詳しく書きません。
Groovy SQL
- DB2に接続する
- SELECT
- INSERT/UPDATE/DELETE
- Batch
ここはもう、Groovyマンセーな話。楽〜。
@Grab('mysql:mysql-connector-java:5.1.23') @GrabConfig(systemClassLoader=true) import groovy.sql.Sql user = '****' pass = '****' sql = Sql.newInstance('jdbc:mysql://*.*.*.*:3306/mysql',user,pass,'com.mysql.jdbc.Driver') result = sql.rows('SELECT Db,User from db') result.each{ row -> println "${row.Db}:${row.User}" }
あと、Prepared Statementの話。
Prepared Statementを使うメリット
- 速度向上
- SQLインジェクション対策
- Prepared StatementがSQLインジェクション対策になるのも知らないほどのDB音痴なので、勉強になりました…
Prepared Statement自体は速度向上が期待出来るが、Groovyでは実装の問題上、速度向上を妨げる部分がある。
Groovy2.1.1のgroovy.sql.Sql.java
Preparedでない場合。
public void query(String sql, Closure closure) throws SQLException { Connection connection = createConnection(); Statement statement = getStatement(connection, sql); ResultSet results = null; try { log.fine(sql); results = statement.executeQuery(sql); closure.call(results); } ...
Preparedの場合。
public void query(String sql, List<Object> params, Closure closure) throws SQLException { Connection connection = createConnection(); PreparedStatement statement = null; ResultSet results = null; try { log.fine(sql); statement = getPreparedStatement(connection, sql, params); results = statement.executeQuery(); closure.call(results); } ...
結局Preparedしても、毎回Statementを生成しているので、その部分はPreparedの良さを殺している…かもしれない。
ただし、RDBの多くは実行計画*1をキャッシュしてるため、Listで渡しで同じようなSQLを続けて打つような後者の実装なら速度向上が見込める可能性は高い。
その他の利点やGroovyの問題点などありましたが、DBに疎い自分が書くと間違ったことを書いてしまう恐れがあるのでやめときます。
多分、ClubDB2のWikiで発表資料は公開されると思うので。
⇒公開して下さいました:#clubdb2 「Javaプログラマーに贈る:Groovyで楽にSQLを実行してみよう」の資料を公開しました | Unofficial DB2 BLOG
Groovy,jdbcともに基礎的な内容だったけど、jdbcに関しては色々得るものも多く、Groovyに関してもプログラミングGroovy読んだけど忘れてる部分などもあって復習になった。
何より、人がGroovyが楽だと言うことを説明してるのを見るとテンション上がる。
最後は
- 作者: 日本アイ・ビー・エム株式会社
- 出版社/メーカー: 翔泳社
- 発売日: 2013/02/27
- メディア: 大型本
- クリック: 1回
- この商品を含むブログ (1件) を見る
DB2を今日知った自分がもらっても良いかと不安になりながらでしたが、しっかり負けたので一安心でした。
*1:コメントを受けて実行結果→実行計画に修正しました