java.sqlによるデータベースアクセス
もう1つ、Groovy JDKの利用例として「データベースアクセス」について紹介しておきましょう。Groovy JDKには、java.sqlパッケージが要されており、そこにあるクラスを利用してデータベースに簡単にアクセスできます。
ここでは、MySQLの中に「mydata」というデータベースを作成し、そこに「addressbook」というテーブルを用意して、これにアクセスをしてみます。テーブルの構造は、次のような感じで考えます。
CREATE TABLE IF NOT EXISTS `addressbook` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `mail` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
このテーブルからレコードを取得し、その中のid、name、mailを一覧出力するような処理を考えてみましょう。これは、次のような感じになります。
import groovy.sql.Sql dbURL = 'jdbc:mysql://localhost:3306/mydata' jdbcDriver = 'com.mysql.jdbc.Driver' sql = Sql.newInstance(dbURL,'root','',jdbcDriver) sql.eachRow('select * from addressbook') { println it.id + "\t" + it.name + "\t" + it.mail }
![図16 MySQLにアクセスしaddressbookのレコードを一覧出力する。](http://cz-cdn.shoeisha.jp/static/images/article/3757/16.gif)
ここでは、java.sqlというパッケージのクラスを使いますので、最初にimportを用意しておきます。SQLアクセスは、Sql
クラスのインスタンスを使って行います。これは、newInstanceを次のように呼び出してインスタンスを作成します。
変数 = Sql.newInstance( アクセス先 , ユーザー , パスワード , ドライバ名 )
これで、データベースへの接続を行い、Sqlインスタンスが返されます。その後にある「eachRow」は、引数に指定したクエリーを送信し、取得されたレコードすべてについてその後のクロージャで用意した処理を実行するものです。
取り出したレコードは、itで渡されます。その中のフィールド類は、it.id
あるいはit['id']
というようにして取り出すことができます。後は、取り出したレコードを処理していくだけです。Javaでのデータベースアクセスと比べると、実に簡単です。
ビルダーについて
この他、Javaには見られないGroovy独自の機能に「ビルダー」があります。これはHTMLやXMLなど構造的なデータを構築していくのに用いられるクラスです。このクラスのメソッドやプロパティを利用することで、非常に簡単にデータを構築できます。
「HTMLなんてエディタで書いた方が早い」「XMLなんてめったに使わない」と思われる人もいるかもしれませんが、では「Swing」はどうでしょう? SwingのGUIも、同様にビルダーを使って分かりやすく作成することができるのですよ。実際にやってみましょう。
import groovy.swing.* import java.awt.* def swing = new SwingBuilder() def textlabel def frame = swing.frame(title:'Frame', size:[300,100]) { borderLayout() textlabel = label( text:"ボタンを押さないで!", constraints: BorderLayout.NORTH ) button( text:'Click Me', actionPerformed: {textlabel.text = "ボタンを押したね?"}, constraints:BorderLayout.SOUTH ) } frame.show()
これは、入力フィールドとプッシュボタンをもった簡単なJFrameのサンプルです。Javaのソースコードとずいぶん違っているのが分かりますね。ここでは、まずnew SwingBuilder
でインスタンスを作成すると、そのframe
を呼び出しています。これは、引数にJFrameのプロパティを指定し、その後のクロージャでJFrameに組み込む内容を記述しているのです。
引数で指定しているtitleとsizeは、文字通りタイトルとサイズを指定するものです。sizeは、配列で縦横の大きさを指定します。クロージャの部分で行っているのは、borderLayoutでボーダーレイアウトを設定し、それからJLabelとJButtonのインスタンスを作成して組み込む作業です。Javaでは、インスタンスを作成した後、コンテナに組み込みますが、SwingBuilderではインスタンス作成時に「constraints」というプロパティに組み込み場所を指定しておくと、そこに組み込んでくれるようになっています。
Javaは「手続きを実行してGUIを構築する」という考え方ですが、GroovyのSwingBuilderは「組み込まれるオブジェクトとその属性を階層的に記述していく」というスタイルになっています。どちらが良いとは言えませんが、少なくともSwingBuilderの方式は、Javaの欠点だった「構築されるGUIの構造が見えない」という問題を解決していることが分かるでしょう。上のソースコードを見れば、JFrame内に何がどう組み込まれているのか一目瞭然です。
Groovyスクリプトの実行
最後に、Groovyスクリプトの実行について触れておきましょう。Groovyのスクリプトは、このGroovyConsoleの中だけでしか実行できないわけではありません。もちろん、スクリプト単独で実行できます。GroovyConsoleで作成したスクリプトを保存し、コマンドプロンプトを起動して次のように実行すれば、スクリプトを実行できます。
groovy スクリプトファイル
例えば「Helo.groovy」といったファイルとして保存したならば、コマンドプロンプトでスクリプトファイルのある場所にカレントディレクトリを移動し、「groovy Helo.groovy」と実行します。これでスクリプトが実行されます。
この他にも、Groovyのスクリプトを実行する方法はあります。それは「Javaのプログラムとして実行する」というものです。Groovyには、スクリプトをJavaクラスファイルにコンパイルする機能があります。これは、コマンドプロンプトから次のように実行します。
groovyc スクリプトファイル
例えば「Helo.groovy」というスクリプトファイルなら、ファイルがある場所にカレントディレクトリを移動し、「groovyc Helo.groovy」と実行します。これで、「Helo.class」というクラスファイルがその場に生成されます(場合によって、その他にもクラスファイルが生成される場合があります)。後は、「java Helo」というようにクラスファイルを実行すれば良いのです。
ただし、Groovyからコンパイルされたクラスファイルを実行するためには、Groovyのライブラリがクラスパスになければいけません。Groovyの「lib」フォルダ内にあるJarファイルをクラスパスが通っている場所(JREの「lib」内にある「ext」フォルダあたりが良いでしょう)にコピーしておくのを忘れないでください。これがないと実行に失敗します。
まとめ
今回は、Groovyの基本的な文法や機能について、Javaとの相違を中心に簡単にまとめてみました。実際に何度かスクリプトを書いてみると分かりますが、基本文法の違いがざっと頭に入れば、ほとんどJavaの延長の感覚でスクリプトを書くことができます。ビルダーなどJavaにないクラスを利用する場合はもちろん独自に学習する必要がありますが、少なくともJavaのクラスライブラリを利用している限り、その差はそれほど感じられないでしょう。唯一、飲み込むのに少々時間がかかりそうなのが「クロージャ」ですが、これもある程度感覚がつかめれば、「なぜ、こんな便利な機能がJavaになかったのか」と思うはずです。
最後にGroovyのスクリプトをJavaのクラスファイルにコンパイルする方法について触れましたが、このことからも分かるように、Groovyは「形を変えたJavaの一種」とも言えます。Groovyのスクリプトは、内部的には常にJavaのバイトコードに変換され実行されています。それが、スクリプトファイルからその場でメモリ内にコンパイルされるか、最初からJavaクラスファイルにコンパイルしたものを実行するかの違いはあれ、「中身はJavaのプログラムとして動いている」という点に違いはありません。「Groovyは形を変えたJavaである」といわれるように、Javaプログラムを作成するための一つの方法としてGroovyという言語をとらえると役割が見えてくるはずです。
この連載では、Grailsを使うための道具としてGroovyについて説明を行いましたが、Groovyという言語は、Grailsのためにあるわけではありません。Javaをより手軽に使えるようにしたスクリプト言語として、Javaを補完するものものとしてJavaプログラマにも恩恵を与えてくれる言語です。次回までの間に簡単なスクリプトを書いて、Groovyという言語に慣れておきましょう。