問題一:Mapper類 autowired失敗
原因:掃描mapper包沒有配置或配置不正確
解決:
方案一:
1. 啓動類加@MapperScan("mapperPackagePath")
方案二:
增加配置類:
package com.yx.readingwebsite.config;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MapperScannerConfigurer 配置DAO層
*/
@Configuration
public class MyBatisMapperScannerConfig {
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setSqlSessionFactoryBeanName("sqlSessionFactory");
msc.setBasePackage("com.yx.readingwebsite.mapper");
return msc;
}
}
問題二:Mapper掃描成功後,繼續報錯,org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
原因:xml的mapper SQL 和 Mapper接口沒有綁定
解決:
方案一:全局配置文件application.yml增加mybatis配置【xml mapper包在resource目錄下】
mybatis:
mapper-locations: classpath:mapper/*.xml
方案二:增加配置類
package com.yx.readingwebsite.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import javax.sql.DataSource;
/**
* 配置MyBatis,引入數據源,sqlSessionFactory,sqlSessionTemplate,事務管理器
*/
@Configuration //配置類
@EnableTransactionManagement //允許使用事務管理器
public class MyBatisModelConfig implements TransactionManagementConfigurer {
@Autowired
private DataSource dataSource;
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory(){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setDataSource(dataSource); //設置數據源
ssfb.setTypeAliasesPackage("com.yx.readingwebsite.model"); //設置掃描模型包【po】
try {
Resource[] resources = new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/*.xml");
ssfb.setMapperLocations(resources);
return ssfb.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
@Bean //獲得Session 模板,從而獲得Session
public SqlSessionTemplate getSqlSessionTemplate(SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
@Override //事務管理器
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
需要注意的是,xml版的mybatis一定要在sqlSessionFactory中指定mapperLocations,即下圖
總結:
兩種配置方案。方案一,使用配置類;方案二,使用配置文件。完整配置如下:
方案一:配置類
package com.yx.readingwebsite.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import javax.sql.DataSource;
/**
* 配置MyBatis,引入數據源,sqlSessionFactory,sqlSessionTemplate,事務管理器
*/
@Configuration //配置類
@EnableTransactionManagement //允許使用事務管理器
public class MyBatisModelConfig implements TransactionManagementConfigurer {
@Autowired
private DataSource dataSource;
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory(){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setDataSource(dataSource); //設置數據源
ssfb.setTypeAliasesPackage("com.yx.readingwebsite.model"); //設置掃描模型包【po】
try {
Resource[] resources = new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/*.xml");
ssfb.setMapperLocations(resources);
return ssfb.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
@Bean //獲得Session 模板,從而獲得Session
public SqlSessionTemplate getSqlSessionTemplate(SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
@Override //事務管理器
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
package com.yx.readingwebsite.config;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MapperScannerConfigurer 配置DAO層
*/
@Configuration
@AutoConfigureAfter(MyBatisModelConfig.class)
public class MyBatisMapperScannerConfig {
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setSqlSessionFactoryBeanName("sqlSessionFactory");
msc.setBasePackage("com.yx.readingwebsite.mapper");
return msc;
}
}
方案二:配置文件 application.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/readingWebsite?useUnicode=true&characterEncoding=utf-8
username:
password:
driver-class-name: com.mysql.jdbc.Driver
max-active: 100
max-idle: 10
max-wait: 10000
default-auto-commit: false
time-between-eviction-runs-millis: 30000
min-evictable-idle-time-millis: 30000
test-while-idle: true
test-on-borrow: true
test-on-return: true
validation-query: SELECT 1
mybatis:
mapper-locations: classpath:mapper/*.xml
package com.yx.readingwebsite;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.yx.readingwebsite")
public class ReadingWebsiteApplication {
public static void main(String[] args) {
SpringApplication.run(ReadingWebsiteApplication.class, args);
}
}
借鑑各位大佬:
模塊化開發SpringBoot整合MyBatis時Mapper.xml映射問題
spring boot 整合mybatis org.apache.ibatis.binding.BindingException: Invalid bound statement(not found)
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)異常處理
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name