Springboot +Mybatis整合常见错误 报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

时间:2021-7-4 作者:qvyue

前言:

记录一下在使用Spring Boot 时,由于对框架不熟悉,在项目启动的过程中遇到的问题

问题描述:

问题一:dao层注入问题

Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper

以前是通过xml文件配置的,但spring boot不用配置xml文件。
解决方法:
1:可以在每个dao加上@Mapper或者@Repository注解
2:统一在启动类配置@MapperScan

@SpringBootApplication
@MapperScan("com.example.demo.base.mapper")
@ComponentScan(basePackages = {"com.example.demo"})
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

问题二:配置好之后,启动项目又出现数据源配置问题

Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured

项目中加了Mybatis依赖jar包,SpringBoot数据源自动配置需要我们配置主类中加入@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})自动注入

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@MapperScan("com.example.demo.base.mapper")
@ComponentScan(basePackages = {"com.example.demo"})
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

接下来又报错。。。

Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

原因是mybatis-spring-1.3.2中取消了自动注入SqlSessionFactory 和 SqlSessionTemplate,也就是mybatis依赖版本的问题。

方案一:
mybatis版本太高(1.3.2),于是降级到1.1.1解决问题。
(换这个太麻烦,没有实践,但听说还是有用。。)

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

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

然后让Dao实现类再继承这个CommonDao基类即可。(但我dao用的是接口,不适用)

方案三:
后面将(exclude={DataSourceAutoConfiguration.class})去掉,将application.properties中配置放到新建的application.yml中

application.yml

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/demo_db?serverTimezone=GMT%2B8
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

项目启动成功

方案四:
上面说SqlSessionFactory 和 SqlSessionTemplate没有自动注入,那我们可以自己手动注入

@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));
        } 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;
    }
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。