Spring与ibatis整合学习心得
梁飞虎首先,明确一下ibatis在此工程中的作用相当于hibernate,就是进行数据库的访问,也就是连接操作数据库用的。
因此常说的SSH结构也可用SSI来取代,只是ibatis是一个轻量级的框架。
在spring.jar包中有org.springframework.orm.ibatis.SqlMapClientFactoryBean类,此类用于读取ibatis中的配置文件(总配置文件)sqlMapConfig.xml,具体的配置位置是在applicationContext.xml中:
标记1
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation">
<value>WEB-INF/sqlMapConfig.xml</value>
</property>
</bean>
而sqlMapConfig.xml文件中包含ibatis的map文件信息,这点不再详述。
SqlMapClientFactoryBean,这个class实现了两个interface:FactoryBean和InitializingBean,InitializingBean只有一个方法afterPropertiesSet()
spring调用构造函数后,发现它实现了InitializingBean接口,所以还会调用afterPropertiesSet来进一步初始化此class。
sqlMapClient 就是在这里面创建的。
至此一个完整的工厂创建完成。
FactoryBean接口主要方法就是public Object getObject();
要知道SqlMapClientFactoryBean是一个工厂类,他的作用就是你需要的时候调用它的一个方法,它就会返回你一个你需要的对象。
当然此处返回的就是一个sqlMapClient 对象。
所以这里的getObject实现就是把sqlMapClient 返回给调用者。
spring就是根据接口里的定义来调用getObject方法的,这样可以忽略到底是调用的那个对象的实例(也就是不关心调用的是哪个factory)。
也不关心返回的是什么对象,spring只知道调用了getObject就可以得到此factory所创建的对象就够了。
标记2
<bean id="zjjyyxDao"
class="com.cdc.capital.ibatis.dao.impl.ZjjyyxDaoImpl">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
public class ZjjyyxDaoImpl extends SqlMapClientDaoSupport implements ZjjyyxDAO{
/**
*资金划转录入
*@param yxb
*@return int
*/
public int saveZjjyyx(ZjjyyxBean yxb){
return this.getSqlMapClientTemplate().update("insertZjjyyx", yxb);
}
}
SqlMapClientDaoSupport类有setSqlMapClient(SqlMapClient)方法,通过标记1 和标记2处的配置,再结合Spring的IOC功能,可以得知SqlMapClientFactoryBean读取的sqlMapConfig.xml文件的信息已经传递到了SqlMapClientDaoSupport中。
所以,他调用自己的get…方法可以获得到和ibatis一样的SqlMapClient对象,从而能够连接操作数据库。