升级mybatis后改用mybatis-spring-1.2.0, 再其它配置均未修改的情况下运行出错,错误信息为:

Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

从SqlSessionDaoSupport 这个类的源码中可以看出,原因是mybatis-spring-1.2.0中取消了自动注入SqlSessionFactory 和 SqlSessionTemplate

/**
 * Convenient super class for MyBatis SqlSession data access objects.
 * It gives you access to the template which can then be used to execute SQL methods.
 * <p>
 * This class needs a SqlSessionTemplate or a SqlSessionFactory.
 * If both are set the SqlSessionFactory will be ignored.
 * <p>
 * {code Autowired} was removed from setSqlSessionTemplate and setSqlSessionFactory
 * in version 1.2.0.
 *
 * @see #setSqlSessionFactory
 * @see #setSqlSessionTemplate
 * @see SqlSessionTemplate
 * @version $Id$ 
 */
 public abstract class SqlSessionDaoSupport extends DaoSupport {  
  private SqlSession sqlSession;  
  private boolean externalSqlSession;  
  public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    if (!this.externalSqlSession) {      
      this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
    }
  }  
  public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
    this.sqlSession = sqlSessionTemplate;
    this.externalSqlSession = true;
  }
 ……
}

1.1.1中代码片段为:

public abstract class SqlSessionDaoSupport extends DaoSupport {

     private SqlSession sqlSession;
     private boolean externalSqlSession;

     @Autowired(required = false)
     public final void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
          if (!this.externalSqlSession) {
               this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
          }
     }
     
     @Autowired(required = false)
     public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
          this.sqlSession = sqlSessionTemplate;
          this.externalSqlSession = true;
     }
     ......
}

可能是为了解决多数据源的问题吧,取消了自动注入。没用到多数据源,不太关心这个。

解决方案:
因为我们dao层是继承于一个dao基类,所以只要在这个基类中注入任意一个属性即可。SqlSessionFactory在spring配置文件中已经配置。

public class CommonDao extends SqlSessionDaoSupport {

     @Resource
     public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
          super.setSqlSessionFactory(sqlSessionFactory);
     }
}