iBATIS3.0 betaを触る(2)

iBATIS3.0 は、SqlMapClient が見当たらず、SqlSession を使うことになる。

SqlSessionFactory
 sqlSessionFactory 
     = new SqlSessionFactoryBuilder().build(
     Resources.getResourceAsReader("Configuration.xml"));

SqlSession sqlsession = sqlSessionFactory.openSession();
try{
Date dt = (Date)sqlsession.selectOne("mymapper.getSysDate");
  :
}finally{
    sqlsession.close();
}

このように記述する。

iBATIS3.0 の注目は、アノテーションで、SQLを書けるようになっており、
以下サンプルのようなインターフェースで記述する。
-------------------
package jp.sample;
import org.apache.ibatis.annotations.Select;
// 検索結果を UserInfo (JavaBean) で返す。
public interface UserInfoMapper{
   @Select("SELECT * FROM user_info WHERE id = #{id}")
   public UserInfo selectUserInfo(int id);
}
--------------------
SQL Map XMLは、以下のように書き、Configuration.xml の <mappers> の中に、
<mapper resource="mapper2.xml"/> のように書く
-----------------
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
                 "">http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<mapper namespace="jp.sample.UserInfoMapper" />
---------------
実行は、Sqlsession#getMapper( マッパーclass ); で取得した interface で行う。

SqlSession sqlsession = sqlSessionFactory.openSession();
UserInfoMapper umapper = sqlsession.getMapper(UserInfoMapper.class);
UserInfo uinfo = umapper.selectUserInfo(18);

残念ながら、SQL Map XMLは、<mapper> がルートで、複数記述できない為に、
mapper クラスの数だけ、xml ファイルを用意しなければならず、
  <mapper namespace="..." /> だけが存在する XML を mapper クラスの数の
ファイルを用意して、Configuration.xml<mappers> 中で呼び出さなくては
ならない。

S2Dao+@SqlFile を使用した時を思い出すと、S2Dao で地獄のように、
XMLファイル数が増加したことは解消されない。
(それはデータ設計が悪いのだろうけど。。。)

アノテーションSQLを書くメリットが本当にあるのか疑問が残るが、
少しはこのパターンが存在してもいいと考えているので、
長いSQLや、細かいマッピング、動的SQLは、XML に書き、
1行で済む簡単なSQLはアノテーションという両方をバランスよく配置していきたい。