JRuby で S2JDBC を使用してみる

Groovy では JAR ファイルを変更する事になったが、JRuby はどうなのかと思い試してみることに。

今のところ JRuby ではアノテーションが扱えなさそうだったので、エンティティクラスは Java で定義したものをそのまま使用し、以下のようなスクリプトを実行してみたところ、何の手間を加えずに JRuby 1.0・1.1b1(共に JavaSE 6 で実行、S2・S2Tiger 2.4.18 RC3)上で問題なく動作した。

require 'java'

module S2
    include_package 'org.seasar.framework.container'
    include_package 'org.seasar.framework.container.factory'
    include_package 'org.seasar.extension.jdbc'
    include_package 'org.seasar.extension.jdbc.where'
end

module Entity
    include_package 'woz.entity'
end

S2::SingletonS2ContainerFactory.init

jdbcManager = S2::SingletonS2Container.getComponent("jdbcManager")

dept = Entity::Dept.new
dept.deptNo = 2
dept.deptName = "testdata"

puts jdbcManager.insert(dept).execute

insDept = jdbcManager.from(Entity::Dept.java_class).where(S2::SimpleWhere.new.eq("id", dept.id)).getSingleResult

puts "result : #{insDept.id}, #{insDept.deptNo}, #{insDept.deptName}"

Java の可変長引数が適切に扱えないようだったので、where の引数に SimpleWhere のインスタンスを使うようにした。

なお、dicon ファイルは以下のものだけを使い、app.dicon 以外は JavaS2JDBC を使った時(id:fits:20071127)のファイルをそのまま使用した。

  • app.dicon
  • convention.dicon
  • jdbc.dicon
  • s2jdbc.dicon

ちなみに、app.dicon は以下のように変更。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="s2jdbc.dicon"/>
</components>

S2JDBC を試したり、簡単に使ったりするのに JRuby もありかなと思うが、やっぱり現時点では Groovy の方が書き易い。とりあえず JRuby 2.0 に期待かな。