2007-01-08
■[spring][ibatis] 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>