mybatis-plus配置多数据源invalid bound statement (not found)
原创
©著作权归作者所有:来自51CTO博客作者FunkyTeddy的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、 环境
- 版本号
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
- 没有使用
myabtis-plus
的多数据源依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.7</version>
</dependency>
二、 多数据源配置
- 启动类配置
@MapperScans({
@MapperScan(basePackages = {"com.aaa.dao"}, sqlSessionFactoryRef = DatasourceConf.SESSION_FACTORY),
@MapperScan(basePackages = {"com.bbb.dao"}, sqlSessionFactoryRef = OtherDatasourceConf.OTHER_SESSION_FACTORY)
})
- 配置类
@Configuration
public class DatasourceConf {
public static final String SESSION_FACTORY = "SessionFactory";
@Primary
@Bean(name = SESSION_FACTORY)
public SqlSessionFactory dianOrderSessionFactory(MybatisProperties properties) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(secondDatasource());
//...
}
@Primary
@Bean
public DataSource secondDatasource() {
return new HikariDataSource(secondHikariConfig());
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.aaa.hikari")
public HikariConfig secondHikariConfig() {
return new HikariConfig();
}
}
另一个数据源配置
@Configuration
public class OtherDatasourceConf {
public static final String OTHER_SESSION_FACTORY = "otherSessionFactory";
@Bean(name = OTHER_SESSION_FACTORY)
public SqlSessionFactory otherSessionFactory(MybatisProperties properties) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(otherDataSource());
//....
}
@Bean
public DataSource otherDataSource() {
return new HikariDataSource(otherHikariConfig());
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig otherHikariConfig() {
return new HikariConfig();
}
}
三、异常
在mapper.xml
中配置了sql
的都没问题,但是使用mybatis-plus
的内置函数就会报invalid bound statement (not found)
异常。
四、 解决
- 查看
MybatisPlusAutoConfiguration
类
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisPlusProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisPlusAutoConfiguration implements InitializingBean {
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
// TODO 使用 MybatisSqlSessionFactoryBean 而不是 SqlSessionFactoryBean
MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
factory.setDataSource(dataSource);
...
return factory.getObject();
}
}
- 将
SqlSessionFactoryBean
修改成myabtis-plus
自定义的MybatisSqlSessionFactoryBean
解决 - 注意
mybatis-plus
的配置需要使用MybatisPlusProperties
而不是MybatisProperties
- 当配置类多个
DataSource
,MybatisPlusAutoConfiguration
类就不再生效,需要手动配置