Spring 整合 ibatis
写一下最近用spring整合ibatis,仅供测试学习用。
先讲一下环境:Spring2.5.6+ibatis2.3.3
第一,配置数据源:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>oracle.jdbc.OracleDriver</value> </property> <property name="url"> <value>jdbc:oracle:thin:@192.168.26.106:1521:oracle</value> </property> <property name="username"> <value>scott</value> </property> <property name="password"> <value>normal</value> </property> </bean>
第二,向SqlMapClientFactory中注入DataSource
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"> <value>SqlMapConfig.xml</value> </property> <property name="dataSource" ref="dataSource" /> </bean>
第三,配置事务管理
<!--定义事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 使用tx标签配置拦截器,(如果不配置拦截器,使用注解也是一种不错的方式) --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- 定义需要事务管理的切点 --> <aop:config> <aop:pointcut id="servicesPointcut" expression="execution(public * com.focus.ibatis.service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="servicesPointcut" /> </aop:config>
这样就使用Spring配置好ibatis了,在dao层注入sqlMapClient
<bean id="userDAO" class="com.focus.ibatis.dao.impl.UserDaoImpl"> <property name="sqlMapClient" ref="sqlMapClient" /> </bean>
dao层的代码:
import com.ibatis.sqlmap.client.SqlMapClient; public class UserDaoImpl implements IUserDao { private SqlMapClient sqlMapClient; public void setSqlMapClient(SqlMapClient sqlMapClient) { this.sqlMapClient = sqlMapClient; } @SuppressWarnings("unchecked") @Override public List<User> getList(User args) { List<User> users = new ArrayList<User>(); try { users = (List<User>) sqlMapClient.queryForList("getUserList", args); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return users; } }
这样就完成spring配置ibatis的工作了,可是这个时候有人会疑问了。
为什么要注入的是org.springframework.orm.ibatis.SqlMapClientFactoryBean,而dao层却用com.ibatis.sqlmap.client.SqlMapClient接收,看样子也类型不同啊。
这个就要从spring的机制开始说起,看spring的源码,org.springframework.orm.ibatis.SqlMapClientFactoryBean类的内容:
public class SqlMapClientFactoryBean implements FactoryBean, InitializingBean { private static final ThreadLocal configTimeLobHandlerHolder = new ThreadLocal(); private Resource[] configLocations; private Resource[] mappingLocations; private Properties sqlMapClientProperties; private DataSource dataSource; private boolean useTransactionAwareDataSource = true; private Class transactionConfigClass = ExternalTransactionConfig.class; private Properties transactionConfigProperties; private LobHandler lobHandler; private SqlMapClient sqlMapClient; ........................ public Object getObject() { return this.sqlMapClient; } }
在spring的机制里面,如果一个bean实现factoryBean接口,那spring就不会把该类bean本身实例返回,而是返回该bean的getObject()中返回的对象。就是返回了sqlMapClient。
第一次写博客,有哪里不好的地方请指正。

浙公网安备 33010602011771号