今までiBATISのことを誤解していました

結局Mercurial問題は解決しないもののOSを入れ替えてしまったので色々と環境の復元に追われている私がきましたよ。

JTerminalを入れなおしたり、finkを入れ直したり、Subversionを入れ直したり、NetBeansを設定しなおしたり、色々大変です。

全然関係無いですけど、10.4までは、起動中のアプリケーションはDoc内でなんか矢印がついていたような記憶があったのですが、10.5になってから印が消えたなーと思ったら、起動中のアプリケーションには矢印じゃなく青い光みたいのが陰っぽい感じでつくようになったんすね。ちょっぴりかっこいい。

それはさておき。

私は今までiBATISのことを誤解していました。それは、


この日の日記に書いているのですが、

  1. resultMapの記述が面倒くさい。
 
    1. これくらい一々定義しなくてもCoC的にオートでマッピングしてくれても良さそうなものなのだが。
    2. 動的SQLもやりすぎるとテストが大変そう。
  1. sqlMapConfig.xmlのresourceに一々sql-mapファイルを設定しないといけないのが面倒くさい。
    1. hoge.huga.PiyoDao用にhoge.huga.PiyoDao.xmlをおいとけばそこから自動的に読込んでくれるとうれしいのだが。

と、思っていた訳です。

http://ibatis.apache.org/javadownloads.cgi

ここのサイトの「Documentation」の「Japanese」のところを読んでみるに、

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE sqlMap 
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" 
    "http://ibatis.apache.org/dtd/sql-map-2.dtd"> 
<sqlMap namespace="Person"> 
      <select id="getPerson" resultClass="examples.domain.Person"> 
          SELECT 
              PER_ID as id, 
              PER_FIRST_NAME as firstName, 
              PER_LAST_NAME as lastName, 
              PER_BIRTH_DATE as birthDate, 
              PER_WEIGHT_KG as weightInKilograms, 
              PER_HEIGHT_M as heightInMeters 
          FROM
              PERSON 
          WHERE
              PER_ID = #value# 
      </select> 
</sqlMap> 

「上記の実例は、SQL Mapの最もシンプルな形を示しています。ResultSetのカラムとJavaBeansのプロパティ(もしくは、Mapキーなど)で名称が一致しているものを自動的にマップするSQL Mapsの機能を使っています。」

(; ̄Д ̄)

そんな機能があったのか・・・


このJavaDocからリンクはってある、


ここの解説からは、そんなことは読み取れなかったのだが・・・

ということはですね。

 

これくらい一々定義しなくても、

SELECT USER_ID as userId (略)

と、SQLを書けば、自動的にマッピングしてくれるという訳ですね!?

むむむ。

  1. sqlMapConfig.xmlのresourceに一々sql-mapファイルを設定しないといけないのが面倒くさい。
    1. hoge.huga.PiyoDao用にhoge.huga.PiyoDao.xmlをおいとけばそこから自動的に読込んでくれるとうれしいのだが。

これに関しても、Springと組み合わせれば、

  • SqlMapClientFactoryBeanを継承する
  • ApplicationContextAwareをimplementsする
  • afterPropertiesSet()をオーバーライドする
  • ApplicationContext#getBeanNamesForType()を実行し、SqlMapClientDaoSupportを継承しているクラスのBean-IDを取得する。
  • 取得したBean-IDを元にApplicationContext#getBean()を実行してインスタンスを取得する。
  • 取得したインスタンスのクラス名を取得する。
    • クラス名がhoge.huga.PiyoDaoだった場合、hoge.huga.PiyoDao.xmlsql-mapファイルと判断。
  • commons betwixtとPipedOutputStreamを利用し、PipedInputStreamに直接sqlMapConfigの内容を書き込む。
  • PipedInputStreamを元にInputStreamResourceを生成する。
  • 生成したInputStreamResourceを、SqlMapClientFactoryBeanのconfigLocationに設定する。

なんていうSqlMapClientFactoryBeanのサブクラスを作れば、物理的にsqlMapConfig.xmlを用意しなくても、アプリケーション起動時に動的にsqlMapConfig.xmlを生成できてメンテナンスが楽かも。

むむむ。

なんだか、急にSpring+iBATISで全然鉄板のような気がしてきました。