2009年08月29日

iBATIS3のbeta2が出たのでとりあえず動くコードを書いてみました

iBATIS3のbeta2が出たのでとりあえず動くコードを書いてみた。
トランザクション周り無視で、新しい機能としてまず、Annotationを利用した部分を動かしてみました。
作成環境はEclipse3.5+m2eclipse。
依存するjarファイルは勝手に取ってきてくれます。
DBはH2を使ってます。

サンプルコード

2の頃ではXMLベースで設定ファイルが物理的に存在しないとどうにもならなかったiBATISですがJavaのコードで設定等ができるようになりました。
従来DIで扱いづらかったiBATISですがかなり柔軟なことができるようなったと思います。

Annotationを使ったDBアクセスですが、S2Daoに似た感じとなってます。
インターフェースのみを書いてそれをConfiguration.addMapperとすることでプロキシコードを生成して、メソッドをフックして該当処理を行うような形です。DIコンテナを意識した設計なってイメージですかね。

実際にMapperのインターフェースですが、該当メソッドにSQLのAnnotationをつけて処理をしています。


package jp.canetrash.sample.ibatis3.mapper;

import java.util.List;

import jp.canetrash.sample.ibatis3.domain.Emp;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

public interface EmpMapper {

@Select("SELECT * FROM emp ")
List selectAllEmp();

Emp selectEmp(int id);

@Insert("insert into emp (id, name, title ) values (#{id}, #{name}, #{title})")
void insertEmp(Emp emp);

@Delete("delete from emp where id = #{id}")
int deleteEmp(int id);

int updateEmp(Emp emp);

@Update("create table emp (id integer, name varchar(128), title varchar(128)) ")
void createTable();

@Update("drop table emp")
void dropTable();
}

返却値のモデルへのマッピングは自動でやってくれます。

印象として以前のIBMでの記事のiBATIS版という感じでしょうか?
DAOを繰り返すな!

AnnotationとSQLMap.xmlとの住み分けですが単純なSQL(いわゆるCRUD)な部分はAnnotationで複雑なSQLはSQLMap.xmlで記述にわかれそうです。

他ではは、SQLMap.xmlでのDynamicSQLにOGNLが使えるようになったことがあります。下の例でみるとわかると思いますが、JSPでの学習がそまま、iBATIS3のDynamicSQLで生かせることがわかります

<iftest="title != null">
AND title like #{title}
</if>
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null && author.name != null">
AND title like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>


最後に自分でSQLを生成してSQLを発行できるのですが、SQLを生成をサポートするSelectBuilderというものがあります。面白いのがSelectBuilderクラスをstatic importしてメソッド呼び出しによってSQLを生成するというものです。

import static org.apache.ibatis.jdbc.SelectBuilder.*;
...
private String selectPersonSql() {
BEGIN(); // Clears ThreadLocal variable
SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
FROM("PERSON P");
FROM("ACCOUNT A");
INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
WHERE("P.ID = A.ID");
WHERE("P.FIRST_NAME like ?");
OR();
WHERE("P.LAST_NAME like ?");
GROUP_BY("P.ID");
HAVING("P.LAST_NAME like ?");
OR();
HAVING("P.FIRST_NAME like ?");
ORDER_BY("P.ID");
ORDER_BY("P.FULL_NAME");
return SQL();
}

実際にSQLをJavaの文字列操作で組み立て見るとわかると思いますが相当面倒です。SelectBuilderを使うとかなり負荷を軽減して可読性があがると思うのですが、使い道が浮かびません><

posted by tfunato at 21:00 | コメント[0] | トラックバック[0] | iBATIS このエントリーを含むはてなブックマーク はてなブックマーク - iBATIS3のbeta2が出たのでとりあえず動くコードを書いてみました
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※承認されるまで反映されません!
この記事へのTrackBack URL
http://blog.seesaa.jp/tb/126745019