具体报错信息报错信息:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx.mapper.CourseMapper.getCourseTeacherDetail,很多文章说是mapper的namespace 路径不对,或者替换原来mbatis-plus-boot-starter相关依赖等,更换原来依赖确实可以解决,但是项目使用结构也要更换那毫无意义,在下有幸看了一个博主大神写的一篇有关于mbatis-plus-boot-starter依赖的一个坑,通过看底层原理以及debug下的mapper-locations路径与当前配置的路径进行转换使无法找到,后面是怎样解决的请看下面代码,强烈有效,我才用重写数据源指定mybaitsPlus 文件路径。
package com.ly.mp.app.config;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.ly.mp.app.common.multiple.MultipleDataSource;
import com.ly.mp.app.common.multiple.enums.DataSourceEnum;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
* MybatisPlus配置类
* @author huangan
*/
@Configuration
public class MybatisPlusConfig {
/**
* @description: 配置分页插件
* @author: gradual
* @param: []
* @return: com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* @description: SQL执行效率插件
* @author: gradual
* @param: []
* @return: com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 逻辑删除用,3.1.1之后的版本可不需要配置该bean,但项目这里用的是3.1.0的
* @author David Hong
* @return com.baomidou.mybatisplus.core.injector.ISqlInjector
*/
@Bean
public ISqlInjector sqlInjector() {
return (ISqlInjector) new LogicSqlInjector();
}
@Bean(name = "globalConfig")
@Primary
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
return globalConfig;
}
@Bean("sqlSessionFactory")
@Primary
public SqlSessionFactory dbSqlSessionFactory(@Qualifier("dataSource") DataSource dataSource, GlobalConfig globalConfig) throws Exception {
// MybatisSqlSessionFactoryBean
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setGlobalConfig(globalConfig());
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 需要在这里指定xml文件的位置,不然自定义的sql会报Invalid bound statement异常
factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/*Mapper.xml"));
// 导入mybatis配置 构造方法,解决动态数据源循环依赖问题
MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
// 配置分页插件
mybatisConfiguration.addInterceptor(new PaginationInterceptor());
// 配置打印sql语句
mybatisConfiguration.setLogImpl(StdOutImpl.class);
factoryBean.setConfiguration(mybatisConfiguration);
return factoryBean.getObject();
}
}