Terry.Li-彬

虚其心,可解天下之问;专其心,可治天下之学;静其心,可悟天下之理;恒其心,可成天下之业。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  143 随笔 :: 344 文章 :: 130 评论 :: 0 Trackbacks

 

将此文章收藏到豌豆网

3、除去工厂类以及相应的配置文件

除去DaoConfig.java这个DAO工厂类和相应的配置文件dao.xml,因为DAO的获取现在要用spring来管理。

4、DAO在Spring中的配置(applicationContext.xml)

<bean id="dataSource"
                        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                        <property name="driverClassName">
                        <value>org.hsqldb.jdbcDriver</value>
                        </property>
                        <property name="url">
                        <value>jdbc:hsqldb:hsql://localhost/xdb</value>
                        </property>
                        <property name="username">
                        <value>sa</value>
                        </property>
                        <property name="password">
                        <value></value>
                        </property>
                        </bean>
                        <!-- ibatis sqlMapClient config -->
                        <bean id="sqlMapClient"
                        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
                        <property name="configLocation">
                        <value>
                        classpath:com\ibatis\jpetstore\persistence\sqlmapdao\sql\sql-map-config.xml
                        </value>
                        </property>
                        <property name="dataSource">
                        <ref bean="dataSource"/>
                        </property>
                        </bean>
                        <!-- Transactions -->
                        <bean id="TransactionManager"
                        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                        <property name="dataSource">
                        <ref bean="dataSource"/>
                        </property>
                        </bean>
                        <!-- persistence layer -->
                        <bean id="AccountDao"
                        class="com.ibatis.jpetstore.persistence.sqlmapdao.AccountSqlMapDao">
                        <property name="sqlMapClient">
                        <ref local="sqlMapClient"/>
                        </property>
                        </bean>


1. 我们首先创建一个数据源dataSource,在这里配置的是hsqldb数据库。如果是ORACLE数据库,driverClassName的值是"oracle.jdbc.driver.OracleDriver",URL的值类似于"jdbc:oracle:thin:@wugfMobile:1521:cdcf"。数据源现在由spring来管理,那么现在我们就可以去掉properties目录下database.properties这个配置文件了;还有不要忘记修改sql-map-config.xml,去掉 对它的引用。

2. sqlMapClient节点。这个是针对ibatis SqlMap的SqlMapClientFactoryBean配置。实际上配置了一个sqlMapClient的创建工厂类。configLocation属性配置了ibatis映射文件的名称。dataSource属性指向了使用的数据源,这样所有使用sqlMapClient的DAO都默认使用了该数据源,除非在DAO的配置中另外显式指定。

3. TransactionManager节点。定义了事务,使用的是DataSourceTransactionManager。

4. 下面就可以定义DAO节点了,如AccountDao,它的实现类是com.ibatis.jpetstore.persistence.sqlmapdao.AccountSqlMapDao,使用的SQL配置从sqlMapClient中读取,数据库连接没有特别列出,那么就是默认使用sqlMapClient配置的数据源datasource。

这样,我们就把持久层改造完了,其他的DAO配置类似于AccountDao。怎么样?简单吧。这次有接口了:) AccountDao接口->AccountSqlMapDao实现。

3.5. 业务层

业务层的位置以及相关类,如下图所示:在这个例子中只有3个业务类,我们以OrderService类为例来改造,这个类是最复杂的,其中涉及了事务。

1、在ApplicationContext配置文件中增加bean的配置:

<bean id="OrderService"
                        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                        <property name="transactionManager">
                        <ref local="TransactionManager"></ref>
                        </property>
                        <property name="target">
                        <bean class="com.ibatis.jpetstore.service.OrderService">
                        <property name="itemDao">
                        <ref bean="ItemDao"/>
                        </property>
                        <property name="orderDao">
                        <ref bean="OrderDao"/>
                        </property>
                        <property name="sequenceDao">
                        <ref bean="SequenceDao"/>
                        </property>
                        </bean>
                        </property>
                        <property name="transactionAttributes">
                        <props>
                        <prop key="insert*">PROPAGATION_REQUIRED</prop>
                        </props>
                        </property>
                        </bean>


定义了一个OrderService,还是很容易懂的。为了简单起见,使用了嵌套bean,其实现类是com.ibatis.jpetstore.service.OrderService,分别引用了ItemDao,OrderDao,SequenceDao。该bean的insert*实现了事务管理(AOP方式)。TransactionProxyFactoryBean自动创建一个事务advisor, 该advisor包括一个基于事务属性的pointcut,因此只有事务性的方法被拦截。

2、业务类的修改,以OrderService为例:

public class OrderService {
                        /* Private Fields */
                        private ItemDao itemDao;
                        private OrderDao orderDao;
                        private SequenceDao sequenceDao;
                        /* Constructors */
                        public OrderService() {
                        }
                        /**
                        * @param itemDao 要设置的 itemDao。
                        */
                        public final void setItemDao(ItemDao itemDao) {
                        this.itemDao = itemDao;
                        }
                        /**
                        * @param orderDao 要设置的 orderDao。
                        */
                        public final void setOrderDao(OrderDao orderDao) {
                        this.orderDao = orderDao;
                        }
                        /**
                        * @param sequenceDao 要设置的 sequenceDao。
                        */
                        public final void setSequenceDao(SequenceDao sequenceDao) {
                        this.sequenceDao = sequenceDao;
                        }
                        //剩下的部分
                        …….
                        }


红色部分为修改部分。Spring采用的是Type2的设置依赖注入,所以我们只需要定义属性和相应的设值函数就可以了,ItemDao,OrderDao,SequenceDao的值由spring在运行期间注入。构造函数就可以为空了,另外也不需要自己编写代码处理事务了(事务在配置中声明),daoManager.startTransaction();等与事务相关的语句也可以去掉了。和原来的代码比较一下,是不是处理精简了很多!可以更关注业务的实现。

4. 结束语

ibatis是一个功能强大实用的SQL Map工具,可以直接控制SQL,为系统设计提供了更大的自由空间。其提供的最新示例程序JpetStore 4.0,设计优雅,应用了迄今为止很多最佳实践和设计模式,非常适于学习以及在此基础上创建轻量级的J2EE WEB应用程序。JpetStore 4.0是基于struts的,本文在此基础上,最大程度保持了原有设计的精华以及最小的代码改动量,在业务层和持久化层引入了Spring。在您阅读了本文以及改造后的源代码后,会深切的感受到Spring带来的种种好处:自然的面向接口的编程,业务对象的依赖注入,一致的数据存取框架和声明式的事务处理,统一的配置文件…更重要的是Spring既是全面的又是模块化的,Spring有分层的体系结构,这意味着您能选择仅仅使用它任何一个独立的部分,就像本文,而它的架构又是内部一致。
posted on 2007-12-05 15:41 礼物 阅读(325) 评论(0)  编辑  收藏 所属分类: ibatis + spring