Springboot +Mybatis报错:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

导航

  • 1、报错原因分析
  • 2、解决方案(提供三种方案)
    • 方案一:进行手动注册
    • 方案二:(不建议)
    • 方案三:([原博客地址](https://www.cnblogs.com/jun1019/p/6718937.html))

1、报错原因分析

(1)字面上意思:需要 sqlSessionFactory 和 sqlSessionTemplate。即,项目中需要用到这两个类,可是并没有注入到容器中.
(2)在1.3.2中取消了sqlSessionFactory 和 sqlSessionTemplate的自动注入,所以只能手动注入。

2、解决方案(提供三种方案)

方案一:进行手动注册

我在使用SSM框架时,可以通过xml配置文件来进行注册,配置信息如下:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		
		<property name="configLocation" value="classpath:mybatis-config.xml">property>
		<property name="dataSource" ref="pooledDataSource">property>
		
		<property name="mapperLocations" value="classpath:mapper/*.xml">property>
	bean>

	
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		
		<property name="basePackage" value="com.atguigu.crud.dao">property>
	bean>
	
	
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory">constructor-arg>
		<constructor-arg name="executorType" value="BATCH">constructor-arg>
	bean>
	

从上面的配置文件中可以看出手动注入了sqlSessionFactory 和 sqlSessionTemplate,那么我们在使用SpringBoot的时候也可以手动注入。
首先创建一个MybatisConfig配置类,sqlSessionFactory 和 sqlSessionTemplate的自动注册如下所示。(在我的项目中我使用的是Mybatis-plus,Mybatis采用同样的方式也是可以的

 @Value("${mybatis-plus.mapper-locations}")
    private String mapperLocations;
    //配置FactoryBean
    @Bean(name = "sqlSessionFactoryBean")
    public SqlSessionFactoryBean sqlSessionFactoryBean() {
        SqlSessionFactoryBean sqlSessionFactoryBean = null;
        try {
            // 加载JNDI配置
            Context context = new InitialContext();
            // 实例SessionFactory
            sqlSessionFactoryBean = new SqlSessionFactoryBean();
            // 配置数据源
            sqlSessionFactoryBean.setDataSource(dataSource());
            // 加载MyBatis配置文件
            PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
            // 能加载多个,所以可以配置通配符(如:classpath*:mapper/**/*.xml)
            sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));
            // 配置mybatis的config文件(我目前用不上)
            // sqlSessionFactoryBean.setConfigLocation("mybatis-config.xml");
        } catch (Exception e) {
            System.out.println("创建SqlSession连接工厂错误:{}");
        }
        return sqlSessionFactoryBean;
    }
    @Bean
    public SqlSessionTemplate sqlSessionTemplate() throws Exception {
        SqlSessionTemplate sqlSessionTemplate=new SqlSessionTemplate(sqlSessionFactoryBean().getObject(),ExecutorType.BATCH);
        return sqlSessionTemplate;
    }

配置好,项目运行成功。

方案二:(不建议)

mybatis版本太高(1.3.2),于是降级到1.1.1解决问题。

方案三:(原博客地址)

dao层继承了SqlSessionDaoSupport,该类会自动注入SQLSessionFectory,我们只要使用this.getSqlSession()就可以拿到SqlSession。
但是如果使用的是"mybatis-spring-1.0.0-RC3.jar"这个版本是没有问题的。但是高版本就会有问题,原因是Mybatis3依赖的jar包"mybatis-spring-1.2.0.jar"这个版本以及以上的版本中,对SqlSessionDaoSupport类中的’sqlSessionFactory’或’sqlSessionTemplate’注入方式进行了调整。
可能是为了解决多数据源的问题吧,取消了自动注入。

解决办法:创建一个Dao的基类CommonDao,让这个基类继承SqlSessionDaoSupport,并通过set方法注入SqlSessionFactory属性即可:

public class CommonDao extends SqlSessionDaoSupport {
    @Resource
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
        super.setSqlSessionFactory(sqlSessionFactory);
    }
}

然后让Dao实现类再继承这个CommonDao基类即可:

@Repository
public class PersonDaoImpl extends CommonDao implements PersonDao {
  //此处省略...  
}

重新项目,解决问题。注意在dao层接口上加上注解@Repository

你可能感兴趣的:(JavaEE)