Spring+Ibatis集成

来源:互联网 发布:淘宝如何批量定时上架 编辑:程序博客网 时间:2024/06/06 01:43

FROM:http://x98zero.javaeye.com/blog/168710

  1. Spring对IBatis提供了完善的内建支持。使用Spring提供的IBatis辅助类,可以大大简化原有的IBatis访问代码。这些辅助类位于org.springframework.orm.ibatis包下,目前Spring可同时支持 IBatis1.3.x和2.0。 此外,针对IBatis,Spring也提供了和JdbcTemplate一致的异常处理方式 
  2. Spring宠物店非常典型的展现了Spring和IBatis的整合,下文将围绕宠物店展开介绍。 
  3. 首先来看宠物店中的一个领域对象(它是一个标准的JavaBean)和它的映射文件,如代码10.13~10.14 所示。 
  4. 代码10.13 Product.java 
  5. Java代码  
  6. public class Product implements Serializable {    
  7.  private String productId;    
  8.  private String categoryId;    
  9.  private String name;     private String description;    
  10.  //getter/setter...    
  11. }  
  1. 代码10.14 Product.xml 
  2. <sqlMap namespace="Product">    
  3.  ...    
  4.  <resultMap id="result"      
  5.  class="org.springframework.samples.jpetstore.domain.Product">    
  6.  <result property="productId" column="productid" columnIndex="1"/>     
  7.  </resultMap>      
  8.  <select id="getProduct" resultMap="result">      
  9.  select productid, name, descn, category from product where productid =    
  10. #value#      
  11.  </select>     
  12.  <select id="getProductListByCategory" resultMap="result">    
  13.  select productid, name, descn, category from product where category =    
  14. #value#    
  15.  </select>      
  16.  ...    
  17. </sqlMap>   
  18. 10.3.2 衔接IBatis配置和DAO实现 
  19. 接着给出IBatis的基本配置文件,如代码10.15所示。 
  20. 代码10.15 sql-map-config.xml 
  21. <sqlMapConfig>     
  22.  ...     
  23.  <sqlMap    
  24. resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Product.xml"/> 
  25.  ...      
  26. </sqlMapConfig>  
  27. 在宠物店中,该文件仅包含了所有领域对象的映射文件,而挪走了关于IBatis的事务和数据源配置(即 
  28. IBatis配置文件中的transactionManager元素和它的子元素dataSource)。 
  29. 注意:在稍后将要给出的Spring配置文件中接手了这些配置,这是一个整合点。 
  1. 在宠物店中,持久和数据访问都是通过DAO来实现的。对于Product,存在一个与其对应的 
  2. SqlMapProductDao,如代码10.16所示。 
  3. 代码10.16 SqlMapProductDao.java 
  4. package org.springframework.samples.jpetstore.dao.ibatis;    
  5. import java.util.ArrayList;     
  6. import java.util.List;     
  7. import java.util.StringTokenizer;    
  8. import org.springframework.dao.DataAccessException;    
  9. import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;    
  10. import org.springframework.samples.jpetstore.dao.ProductDao;    
  11. import org.springframework.samples.jpetstore.domain.Product;    
  12. public class SqlMapProductDao extends SqlMapClientDaoSupport    
  13.  implements ProductDao {    
  14.  public List getProductListByCategory(String categoryId)    
  15.  throws DataAccessException {    
  16.      return    getSqlMapClientTemplate().queryForList("getProductListByCategory",  categoryId);    
  17.  }    
  18.  public Product getProduct(String productId throws DataAccessException {    
  19.      return (Product) getSqlMapClientTemplate().queryForObject("getProduct",   productId);    
  20.  }    
  21.  ...    
  22. }   
  23. 上述代码中出现了Spring提供的IBatis DAO支持类和获取SqlMapClientTemplate的父类模板方法, 这和JdbcDaoSupport及JdbcTemplate的使用具有一致的概念。并且,这些操作都统一的抛出Spring的 通用数据访问异常DataAccessException。 
  24. 注意:在早期的IBatis1.3.x版本中Dao支持类和模板类分别被命名为SqlMapDaoSupport和 SqlMapTemplate,在使用时不要混淆。 
  1. 10.3.3 关键整合点:Spring配置文件 
  2. 有了以上的DAO组件后,来看一下Spring的配置,这是一个关键的整合点,如代码10.17所示。 
  3. 代码10.17 dataAccessContext-local.xml 
  4. <?xml version="1.0" encoding="UTF-8"?>    
  5. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"    
  6. "http://www.springframework.org/dtd/spring-beans.dtd">    
  7. <beans>    
  8.  <!-- 相关数据源和事务管理的定义 -->    
  9.  <bean id="dataSource"      
  10. class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">      
  11.  <property name="driverClassName" value="${jdbc.driverClassName}"/>      
  12.  <property name="url" value="${jdbc.url}"/>    
  13.  <property name="username" value="${jdbc.username}"/>    
  14.  <property name="password" value="${jdbc.password}"/>    
  15.  </bean>      
  16.  <!-- Transaction manager for a single JDBC DataSource -->    
  17.  <bean id="transactionManager"    
  18.  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    
  19.  <property name="dataSource" ref="dataSource"/>    
  20.  </bean>    
  21.  <!-- Spring提供的iBatis的SqlMap配置-->    
  22.  <bean id="sqlMapClient"    
  23. class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">    
  24.  <property name="configLocation" value="WEB-INF/sql-map-config.xml"/>    
  25.  <property name="dataSource" ref="dataSource"/>    
  26.  </bean>    
  27.  <!-- DAO定义-->    
  28.  ...    
  29.  <bean id="productDao"    
  30.   
  31. class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapProductDao"  
  32. >    
  33.  <property name="sqlMapClient" ref="sqlMapClient"/>      
  34.  </bean>    
  35.  ...    
  36. </beans>   
  37. 可以发现,Spring在上述文件中分别配置了数据源和事务管理的策略,其中挪去了原先在IBatis文件中的配置。
    说明:这样做的好处是可以通过Spring IoC容器统一的管理资源,在稍后还可以看到,Spring提供的声 明性事务管理就是借助于统一的数据源和事务管理配置。
    SqlMapClientFactoryBean
    又是一个工厂bean,它暴露了两个关键属性用于注射IBatis配置文件和相关的数据源。在工厂内部,通过读取IBatis配置文件,Spring会创建出IBatis的核心组件SqlMapClient, 并向相关的DAO进行注射。
    SqlMapProductDao
    继承了SqlMapClientDaoSupport,后者暴露出一个sqlMapClient属性,用于接受 Spring的注射。SqlMapClientDaoSupport会对其中封装的SqlMapClientTemplate做相应的设置,所以DAO 子类便可在取用SqlMapClientTemplate时正常地工作了。
  1. 10.3.4 添加声明式事务管理 
  2. 以上的IBatis DAO可以很自方便地被注射到相应的业务对象,并参与到Spring提供的声明性事务中, 
  3. 配置如代码10.18所示。 
  4. 代码10.18 applicationContext.xml 
  5. <?xml version="1.0" encoding="UTF-8"?>    
  6. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"    
  7. "http://www.springframework.org/dtd/spring-beans.dtd">    
  8. <beans>    
  9. <!-- 通用属性文件定义 -->    
  10. <bean id="propertyConfigurer"    
  11. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">    
  12. <property name="locations">    
  13. <list>    
  14. ...    
  15. <value>WEB-INF/jdbc.properties</value>    
  16. </list>    
  17. </property>    
  18. </bean>    
  19. <!-- 业务对象定义 -->    
  20. <bean id="baseTransactionProxy"    
  21. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"    abstract="true">    
  22. <property name="transactionManager" ref="transactionManager"/>   
  23. <property name="transactionAttributes">    
  24. <props>    
  25. <prop key="insert*">PROPAGATION_REQUIRED</prop>      
  26. <prop key="update*">PROPAGATION_REQUIRED</prop>    
  27. <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>    
  28. </props>    
  29. </property>    
  30. </bean>    
  31.  <bean id="petStore" parent="baseTransactionProxy">    
  32.  <property name="target">    
  33.  <bean class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">    
  34.  ...    
  35.  <property name="productDao" ref="productDao"/>    
  36.  ...    
  37.  </bean>    
  38.  </bean>    
  39. </beans>   
  40. 至此就基本完成了Spring IoC和IBatis的整合了,当然也可以通过编程的方式来使用Spring所提供的模板和支持类。
原创粉丝点击