Spring3.0とMyBatisの設定メモ

SpringとMyBatisを連携して使う場合、MyBatisが用意している連携用ライブラリを使うらしい。
というわけでメモ。正しいのかどうかは知らないけど、ちゃんとできてるようには見える。

  • 設定ファイル

データソースとMyBatisとトランザクションの定義。
トランザクションとかDaoの定義はアノテーションでやるのでナシ。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="xxx" />
    <property name="url" value="xxx" />
    <property name="username" value="xxx" />
    <property name="password" value="xxx" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="/WEB-INF/sqlMapConfig.xml" />
</bean>

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
  • Daoクラス

SqlSessionDaoSupportを継承するとSqlSessionが取得できるようになる。

@Component
public class HogeDaoImpl extends SqlSessionDaoSupport implements HogeDao {
    @Override
    public Hoge select(String sqlId, Object params) {
        return (Hoge) getSqlSession().selectOne(sqlId, params);
    }
}

で、理由はわからないけど、tx:annotation-drivenの定義とコンポーネントの自動登録
(component-scan)の定義が同じファイルないとトランザクションがきちんと反映されない
罠にはまる。トランザクションは開始してなくとも、SQLは実行できてしまうという
気付かなきゃちょっと怖いことに。


MyBatisでないサンプルだと別で書いてあったりするんだけどなぁ。
そもそも設定ファイルの読み込み順とかどう解決してるのかとか
まだまだわからんことだらけだ・・・。


参考
http://code.google.com/p/mybatis/wiki/Spring