--
--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:

10
2011

[Java]MyBatisを使ってみた3(3.0.2)

CATEGORYJava
続き2WikipediaのMyBatisのページ訳してたら、前々回の記事の勘違いに気づいたので訂正。

公式ドキュメントによると、XMLファイルを用いずインタフェースを作成してそこにアノテーションで同じようにマッピングを記述していくことも出来るようで、どうもそれを強化していこうとしているような雰囲気を感じる。
(この次のSQLの実行の部分が、キャストが不要になったり、namespaceをコードで指定できたりと改善されている。)
インタフェースにアノテーションでマッピングを記述していくことも出来る、というのは正しい。
が、インタフェースを使う書き方はアノテーション専用ではありませんでしたm(__)m
XML + インタフェース」という書き方ができ、どうもこれが推奨されているようです。

マッパーインタフェース

という名前でいいのかな?DAOっぽいインタフェースとしてSQL定義にあわせてこいつを定義すると、SQLの実行時にキャストが不要になったりと全体的にシンプルになります。

前々回のXMLなら、それにあわせたインタフェースを下記のような感じで定義する。

package foo.dao.mapper;
public interface MemberMapper {
List<Member> select();
Member selectById(int memberId);
int countByName(String name);
void insert(Member member);
void update(Member member);
void delete(int memberId);
}
SQLの実行部はこんな感じに。キャストと長ったらしい文字列が消えてすっきり!
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("Configuration.xml"));
SqlSession session = sqlSessionFactory().openSession();
Member member;
try {
member = session.getMapper(MemberMapper.class).selectById(memberId);
} finally {
session.close();
}

DIコンテナとの連携

上の例だけだとちょっと記述がすっきりする程度の差しかなく、その代わりにインタフェースが必要になるじゃん、という感じなのだが本番はここから。
インタフェースを使った書き方であれば、Springguiceと連携させてMyBatisを使うための諸々のコードもばっさりと排除できるとのこと。

以下は実際に試したguiceを使う例。
まずはMyBatis用のInjectorを用意。手順はいくつかあるみたいだが、下記は設定ファイルを用いる方法。
Injector injector = Guice.createInjector(
new XMLMyBatisModule.Builder()
.setClassPathResource("Configuration.xml")
.setEnvironmentId("production")
.create());
こうやって設定さえしてしまえば、実際のSQL実行部分がこんなスリムになる。
public class MemberService {

@Inject
MemberMapper memberMapper;

public List<Member> find() {
return memberMapper.select();
}
}
・・・わーお。すっきりってレベルじゃねーぞ。
しかもこの方法なら前々回使えないと書いたトランザクション周りの仕組みも普通に使えるはず(未確認)なので、至れり尽くせりか?


自分がこの前MyBatisを使ったときは、薄いDAO層を被せてAPIとかを隠蔽したのだけれど、こういう使い方ができるなら直接サービス層から呼んじゃっても良かったかもね・・・。
開発チームのみんなサーセン。ドキュメントは斜め読みせずよく読みましょうということで(><
スポンサーサイト

Tag: Java MyBatis

0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。