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

前言:

记录一下在使用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

1 @SpringBootApplication
2 @MapperScan("com.example.demo.base.mapper")
3 @ComponentScan(basePackages = {"com.example.demo"})
4 public class DemoApplication {
5     public static void main(String[] args) {
6         SpringApplication.run(DemoApplication.class, args);
7     }
8 }

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

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

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

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

接下来又报错。。。

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属性即可:

1 public class CommonDao extends SqlSessionDaoSupport {
2     @Resource
3     public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
4         super.setSqlSessionFactory(sqlSessionFactory);
5     }
6 }

然后让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没有自动注入,那我们可以自己手动注入

 1 @Value("${mybatis-plus.mapper-locations}")
 2     private String mapperLocations;
 3     //配置FactoryBean
 4     @Bean(name = "sqlSessionFactoryBean")
 5     public SqlSessionFactoryBean sqlSessionFactoryBean() {
 6         SqlSessionFactoryBean sqlSessionFactoryBean = null;
 7         try {
 8             // 加载JNDI配置
 9             Context context = new InitialContext();
10             // 实例SessionFactory
11             sqlSessionFactoryBean = new SqlSessionFactoryBean();
12             // 配置数据源
13             sqlSessionFactoryBean.setDataSource(dataSource());
14             // 加载MyBatis配置文件
15             PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
16             // 能加载多个,所以可以配置通配符(如:classpath*:mapper/**/*.xml)
17             sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));
18         } catch (Exception e) {
19             System.out.println("创建SqlSession连接工厂错误:{}");
20         }
21         return sqlSessionFactoryBean;
22     }
23     @Bean
24     public SqlSessionTemplate sqlSessionTemplate() throws Exception {
25         SqlSessionTemplate sqlSessionTemplate=new SqlSessionTemplate(sqlSessionFactoryBean().getObject(),ExecutorType.BATCH);
26         return sqlSessionTemplate;
27     }

posted on 2020-12-19 15:54  猫的树kireCat  阅读(6955)  评论(0编辑  收藏  举报