読者です 読者をやめる 読者になる 読者になる

M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

MyBatis-Guiceではじめよう

なんといっても簡単にできそうなので、近々MyBatis・GuiceDerbyの組み合わせでコードを動かしてみようと思っています。
一応準備(?)として例によって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時点の内容を使用しました。