MyBatis-Guiceではじめよう
なんといっても簡単にできそうなので、近々MyBatis・Guice・Derbyの組み合わせでコードを動かしてみようと思っています。
一応準備(?)として例によってMyBatis-Guiceの入門テキストを読んでみました。原典は、“MyBatis - MyBatis Guice | Getting started”です。2013/05/26時点の内容を使用しました。
* * *
Getting started
MyBatis-GuiceはあなたのMyBatisコードとGoogle Guiceとをシームレスに統合します。このライブラリのクラス群を使用することで、Google Guiceは必要なMyBatisクラス群を読み込んでくれます。このライブラリはまた、MyBatisデータ・マッパーとSqlSessionをあなたのアプリケーション・ビーン(部品)に依存性注入するのを可能にする簡潔な方法を提供します。最後に、MyBatis-Guiceはあなたを明示的なトランザクション制御から解放します。あなたはトランザクションのコミット/ロールバック/クローズをいちいち手作業で行うことを望まないでしょうから。
Installation
MyBatis-Guiceモジュールをインストールするのはとても簡単。mybatis-guice-X.X.jarとそれが依存するJARファイル群をクラスパスに配置するだけです。
Apache Mavenユーザであれば、次の依存性をPOMファイルに追加するだけで大丈夫です:
<dependencies> ... <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-guice</artifactId> <version>X.X</version> </dependency> ... </dependencies>
Quick Setup
GuiceとともにMyBatisを使用するためには、DataSource〔の各種プロパティ〕を用いてMyBatisModuleをセットアップしましょう。また少なくとも1つのデータ・マッパー・クラスとマッパーが依存性注入されるトランザクション実施ビーンを用意します。
DataSourceのセットアップはJdbcHelperを使用することで簡単に済ませることができます(より多くの情報が必要な場合は関連するAppendixをご覧になってください)。あなたのデータベースに接続するためのURLを組み立て、接続プロパティを提供するプログラム・コードは次のようになります:
Properties myBatisProperties = new Properties(); myBatisProperties.setProperty("mybatis.environment.id", "test"); myBatisProperties.setProperty("JDBC.schema", "mybatis-guice_TEST"); myBatisProperties.setProperty("derby.create", "true"); myBatisProperties.setProperty("JDBC.username", "sa"); myBatisProperties.setProperty("JDBC.password", ""); myBatisProperties.setProperty("JDBC.autoCommit", "false"); Injector injector = Guice.createInjector( JdbcHelper.HSQLDB_Embedded, new Module() { public void configure(Binder binder) { Names.bindProperties(binder, myBatisProperties); } } );
ここではあなたのデータ・マッパー・クラスが次のように定義されているとしましょう:
public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{userId}") User getUser(@Param("userId") String userId); }
このマッパー・クラスはインターフェースとして定義されていなくてはならないことに注意してください。実際に実装されたクラスではありません。この例では、アノテーションがSQLを指定するのに使用されていますが、MyBatisマッパーXMLファイルももちろん使用することができます。
あなたのトランザクション実施サービス・ビーンは〔最前に定義した〕マッパーを使用するとします:
public class FooServiceMapperImpl implements FooService { @Inject private UserMapper userMapper; @Transactional public User doSomeBusinessStuff(String userId) { return this.userMapper.getUser(userId); } }
MyBatisModuleをセットアップします。あなたのマッパーをそこに追加し、トランザクション実施サービス・インターフェースであるFooServiceを、その実装へとバインドします〔訳注:バインドとはGuiceのDI処理APIの概念で、あるインターフェースや抽象を実装コードへと対応づけること〕。
public interface UserMapper { ... Injector injector = Guice.createInjector( new MyBatisModule() { @Override protected void initialize() { install(JdbcHelper.HSQLDB_Embedded); bindDataSourceProviderType(PooledDataSourceProvider.class); bindTransactionFactoryType(JdbcTransactionFactory.class); addMapperClass(UserMapper.class); Names.bindProperties(binder, createTestProperties()); bind(FooService.class).to(FooServiceMapperImpl.class); } } );
以上があなたがする必要のあるすべてです。いまやあなたはサービス・クラスのインスタンスを取得することができます。そこには自動でMyBatisマッパーが依存性注入されています。マッパーを使用してMyBatisデータ・メソッドを呼び出すのは、たったの1行のコードで済みます。これに加えて、すべての処理はトランザクション制御下にあり、すべての接続について明示的なコミットやロールバックは不要です。
FooService fooService = this.injector.getInstance(FooService.class); fooService.doSomeBusinessStuff("data");
* * *
これは翻訳文書です。原典は、“MyBatis - MyBatis Guice | Getting started”です。2013/05/26時点の内容を使用しました。