|
Spring?/span>IBatis提供了完善的内徏支持。?/span>Spring提供?/span>IBatis辅助c,可以大大化原有的IBatis讉K代码。这些辅助类位于org.springframework.orm.ibatis包下Q目?/span>Spring可同时支?/span>IBatis1.3.x?/span>2.0?/span> 此外Q针?/span>IBatisQ?/span>Spring也提供了?/span>JdbcTemplate一致的异常处理方式
10.3.1 标准JavaBean实体和映?/span>
Spring宠物店非常典型的展现?/span>Spring?/span>IBatis的整合,下文围l宠物店展开介绍?/span>
首先来看宠物店中的一个领域对象(它是一个标准的JavaBeanQ和它的映射文gQ如代码10.13~10.14所C?/span>
代码10.13 Product.java
public class Product implements Serializable {
private String productId;
private String categoryId;
private String name;
private String description;
省略getter/setter...
}
代码10.14 Product.xml
<sqlMap namespace="Product">
...
<resultMap id="result"
class="org.springframework.samples.jpetstore.domain.Product">
<result property="productId" column="productid" columnIndex="1"/>
...
</resultMap>
<select id="getProduct" resultMap="result">
select productid, name, descn, category from product where productid = #value#
</select>
<select id="getProductListByCategory" resultMap="result">
select productid, name, descn, category from product where category = #value#
</select>
...
</sqlMap>
10.3.2 衔接IBatis配置?/span>DAO实现
接着l出IBatis的基本配|文Ӟ如代?/span>10.15所C?/span>
代码10.15 sql-map-config.xml
<sqlMapConfig>
...
<sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Product.xml"/>
...
</sqlMapConfig>
在宠物店中,该文件仅包含了所有领域对象的映射文gQ而挪C关于IBatis的事务和数据源配|(?/span>IBatis配置文g中的transactionManager元素和它的子元素dataSourceQ?/span>
注意Q?/span>在稍后将要给出的Spring配置文g中接手了q些配置Q这是一个整合点?/span>
在宠物店中,持久和数据访问都是通过DAO来实现的。对?/span>ProductQ存在一个与其对应的SqlMapProductDaoQ如代码10.16所C?/span>
代码10.16 SqlMapProductDao.java
package org.springframework.samples.jpetstore.dao.ibatis;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.samples.jpetstore.dao.ProductDao;
import org.springframework.samples.jpetstore.domain.Product;
public class SqlMapProductDao
extends SqlMapClientDaoSupport
implements ProductDao {
public List getProductListByCategory(String categoryId)
throws DataAccessException {
return getSqlMapClientTemplate().queryForList("getProductListByCategory",
categoryId);
}
public Product getProduct(String productId)
throws DataAccessException {
return (Product) getSqlMapClientTemplate().queryForObject("getProduct", productId);
}
...
}
上述代码中出CSpring提供?/span>IBatis DAO支持cd获取SqlMapClientTemplate的父cL板方法,q和JdbcDaoSupport?/span>JdbcTemplate的用具有一致的概念。ƈ且,q些操作都统一的抛?/span>Spring的通用数据讉K异常DataAccessException?/span>
注意Q?/span>在早期的IBatis1.3.x版本?/span>Dao支持cd模板cd别被命名?/span>SqlMapDaoSupport?/span>SqlMapTemplateQ在使用时不要淆?/span>
10.3.3 关键整合点:Spring配置文g
有了以上?/span>DAOlg后,来看一?/span>Spring的配|,q是一个关键的整合点,如代?/span>10.17所C?/span>
代码10.17 dataAccessContext-local.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 相关数据源和事务理的定?/span> -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- Transaction manager for a single JDBC DataSource -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- Spring提供?/span>iBatis?/span>SqlMap配置-->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- DAO定义-->
...
<bean id="productDao"
class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapProductDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
...
</beans>
可以发现Q?/span>Spring在上q文件中分别配置了数据源和事务管理的{略Q其中挪M原先?/span>IBatis文g中的配置?/span>
说明Q?/span>q样做的好处是可以通过Spring IoC容器l一的管理资源,在稍后还可以看到Q?/span>Spring提供的声明性事务管理就是借助于统一的数据源和事务管理配|?/span>
SqlMapClientFactoryBean又是一个工?/span>beanQ它暴露了两个关键属性用于注?/span>IBatis配置文g和相关的数据源。在工厂内部Q通过dIBatis配置文gQ?/span>Spring会创建出IBatis的核心组?/span>SqlMapClientQƈ向相关的DAOq行注射?/span>
SqlMapProductDaol承?/span>SqlMapClientDaoSupportQ后者暴露出一?/span>sqlMapClient属性,用于接受Spring的注?/span>SqlMapClientDaoSupport会对其中装?/span>SqlMapClientTemplate做相应的讄Q所?/span>DAO子类便可在取?/span>SqlMapClientTemplate时正常地工作了?/span>
10.3.4 d声明式事务管?/span>
以上?/span>IBatis DAO可以很自方便地被注射到相应的业务对象Qƈ参与?/span>Spring提供的声明性事务中Q配|如代码10.18所C?/span>
代码10.18 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 通用属性文件定?/span> -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
...
<value>WEB-INF/jdbc.properties</value>
</list>
</property>
</bean>
<!-- 业务对象定义 -->
...
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="petStore" parent="baseTransactionProxy">
<property name="target">
<bean class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
...
<property name="productDao" ref="productDao"/>
...
</bean>
</bean>
</beans>
x基本完成了Spring IoC?/span>IBatis的整合了Q当然也可以通过~程的方式来使用Spring所提供的模板和支持cR?/span>