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。

 

第一次写博客,有哪里不好的地方请指正。

 

 

posted @ 2012-08-13 16:50  碧落海的风  阅读(1367)  评论(1)    收藏  举报