iBatis和Spring的整合

         在使用iBatissqlmap时,总是有些疑惑,DAO是怎么找到sqlmap的配置文件的呢,DAO是怎么获得数据库的配置信息的呢,这些又是怎么和Spring整合在一起的呢?带着这些疑问,鄙人试图通过对某个项目的代码分析,来理清这些头绪。
         当我们书写一个DAO实现类时,首先implement一个DAO接口。然后继承BaseDAO类。这个类对SpringDaoSupport类作了扩展,提供了两个重要的方法setDataSource()setSqlMapClient()setDataSource()方法用来设置数据源,从而确定数据库配置信息。而setSqlMapClient()用来设置SqlMapClient,就是SqlMapClient确定了sqlmap的配置。其整个静态结构如下图所示:
1
         在上图中,BaseDAOsetDataSource()setSqlMapClient()方法实际上是分别调用了SqlMapClientTemplate类对象sqlMapClientTemplatesetDataSource()setSqlMapClient()方法。其中setDataSource()方法是SqlMapClientTemplate类通过继承JdbcAccessor类获得。
 
         下面讲讲这一切是怎么和Spring整合到一起的。
         我们在springbean配置文件配置DAO,比如拿admPacVoucherDAO为例:
<beanid="admPacVoucherDAO"class="com.counter.biz.dal.ibatis.IbatisAdmPacVoucherDAO"parent="sqlMapClientDAO"/>
         IbatisAdmPacVoucherDAO继承了BaseDAO类,对于继承来的属性,这里用parent="sqlMapClientDAO" 来获得。sqlMapClientDAO是另一个bean,这个bean就是BaseDAO的实例!也就是说,只要看看这个bean是怎么写的,就可以知道admPacVoucherDAO这个DAO怎么配置起来的。这一点可以从图一中看出来。
         我们找到sqlMapClientDAO的声明如下:
<beanid="sqlMapClientDAO"class="com.counter.biz.dal.BaseDAO">
       <propertyname="sqlMapClient">
           <refbean="sqlMapClient"/>
       </property>
       <propertyname="dataSource">
           <refbean="dataSource"/>
       </property>
    </bean>
果然,其中有sqlMapClientdataSource属性。好!继续追下去,我们看看sqlMapClient这个bean的声明:
<beanid="sqlMapClient"
    class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
       <propertyname="configLocation">
           <value>counter/persistence/counter-sqlmap.xml</value>
       </property>
    </bean>
         哈哈,找到sqlmap配置文件在哪里指定了,就是这里。configLocation指定了配置文件的位置。打开看看果然是各个sqlmap的配置:
<?xmlversion="1.0"encoding="GB2312"?>
<!DOCTYPEsqlMapConfigPUBLIC"-//iBATIS.com//DTD SQL Map Config 2.0//EN""http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
    <settingscacheModelsEnabled="true"enhancementEnabled="false"lazyLoadingEnabled="false"maxRequests="3000"maxSessions="3000"maxTransactions="3000"useStatementNamespaces="false"/>
    <sqlMapresource="counter/sqlmap/pacioli-sql-mapping.xml"/>
    <sqlMapresource="counter/sqlmap/common-sqlmap-mapping.xml"/>
   。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    <sqlMapresource="com/counter/biz/dal/sqlmap/PacVoucherDebitInfo-sqlmap-mapping.xml"/>
    <sqlMapresource="com/counter/biz/dal/sqlmap/PacVoucherExt-sqlmap-mapping.xml"/>
</sqlMapConfig>
         可是再看看sqlMapClient这个bean的类型,疑惑又来了。这个bean根本不是SqlMapClient类的实例,甚至似乎和SqlMapClient没有任何联系。这个bean的类型是SqlMapClientFactoryBean。原来这是一个工厂类,这个类负责组装SqlMapClient类的实例。这个类有getObject()getObjectType()方法。getObject()返回的就是SqlMapClient类的实例,而getObjectType()方法返回SqlMapClient类。这种工厂方法很有意思,笔者会在以后对种方式作深入研究。
         当我通过springIoC获得DAObean,并执行其中一个方法,比如:
publicintgetDebitCountByVoucherId(LongvoucherId){
   Integercount=(Integer)
this.getSqlMapClientTemplate().queryForObject(
                 "MS-PAC-VOUCHER-DEBIT-COUNT-BY-VOUCHERID",voucherId);
   returncount.intValue();
}
         实际是获得SqlMapClientTemplate类对象,并执行其中的方法。而通过上文可以得知,SqlMapClientTemplate类对象通过获得的sqlMapClient就可以得到所有sqlmap的配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值