yohjizzz's Blog

I'm a Programmer.

SpringFramework の iBATIS との連携。

検証環境: Java 1.5.0_09、SpringFramework 2.0.1、iBATIS 2.3.0.677、Jetty 5.1.12。

データソースは Spring にて定義する。※実際は JNDI 経由で参照してるだけ。
  <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName"><value>jdbc/appDS</value></property>
  </bean>
Spring による宣言的トランザクション管理を行う。
  <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />

  <bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
    <property name="properties">
      <props>
        <prop key="insert*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
        <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
      </props>
    </property>
  </bean>

  <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager"><ref bean="transactionManager" /></property>
    <property name="transactionAttributeSource"><ref bean="transactionAttributeSource" /></property>
  </bean>

  <bean id="traceProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
      <list><value>traceInterceptor</value></list>
    </property>
    <property name="beanNames">
      <list>
        <value>*Facade</value>
        <value>*Service</value>
      </list>
    </property>
  </bean>
iBATIS の設定ファイルを用意する。

以下、sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMapConfig PUBLIC
  "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

  <settings
    maxTransactions="5"
    maxRequests="50"
    maxSessions="25"
    cacheModelsEnabled="true"
    lazyLoadingEnabled="true"
    useStatementNamespaces="true" />

  <sqlMap resource="apps/dao/item.xml" />
  <sqlMap resource="apps/dao/order.xml" />

</sqlMapConfig>
iBATIS クライアントを Spring に登録する。
  <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation"><value>sqlMapConfig.xml</value></property>
  </bean>
DAO の実装に SqlMapClientDaoSupport を利用(継承)する。
public interface ItemDao {

    public ItemDto findById(long id) throws DataAccessException;

    public int updateById(ItemDto item) throws DataAccessException;
public class ItemDaoImpl extends SqlMapClientDaoSupport implements ItemDao, Serializable {

    public ItemDto findById(long id) throws DataAccessException {
        
        ItemDto item = new ItemDto();
        item.setId(id);
        
        return (ItemDto)getSqlMapClientTemplate().queryForObject("item.findById", item);
    }

    public int updateById(ItemDto item) throws DataAccessException {
        
        return getSqlMapClientTemplate().update("updateById", item);
    }
  <!--
    SqlMapClientDaoSupport を継承する DAO は、
    以下の2つのプロパティにより SqlMapClientTemplate を自動的に初期化する。
  -->
  <bean id="itemDao" class="apps.dao.ItemDaoImpl">
    <property name="dataSource"><ref bean="dataSource" /></property>
    <property name="sqlMapClient"><ref bean="sqlMapClient" /></property>
  </bean>

SqlMapClientTemplate をカスタマイズしたい場合などはカスタマイズしたテンプレートを DAO に直接参照させることも可能。

  <bean id="sqlMapClientTemplate" class="apps.ibatis.OriginalSqlMapClientTemplate">
    <property name="dataSource"><ref bean="dataSource" /></property>
    <property name="sqlMapClient"><ref bean="sqlMapClient" /></property>
  </bean>

  <bean id="itemDao" class="apps.dao.ItemDaoImpl">
    <property name="sqlMapClientTemplate"><ref bean="sqlMapClientTemplate" /></property>
  </bean>