一、 环境

  1. 版本号
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
  1. 没有使用​​myabtis-plus​​的多数据源依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.7</version>
</dependency>

二、 多数据源配置

  1. 启动类配置
@MapperScans({
@MapperScan(basePackages = {"com.aaa.dao"}, sqlSessionFactoryRef = DatasourceConf.SESSION_FACTORY),
@MapperScan(basePackages = {"com.bbb.dao"}, sqlSessionFactoryRef = OtherDatasourceConf.OTHER_SESSION_FACTORY)
})
  1. 配置类
@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)​​异常。

四、 解决

  1. 查看​​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();
}
}
  1. 将​​SqlSessionFactoryBean​​​修改成​​myabtis-plus​​​自定义的​​MybatisSqlSessionFactoryBean​​解决
  2. 注意​​mybatis-plus​​​的配置需要使用​​MybatisPlusProperties​​​而不是​​MybatisProperties​
  3. 当配置类多个​​DataSource​​​,​​MybatisPlusAutoConfiguration​​类就不再生效,需要手动配置