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 }