参考官方文档 https://baomidou.com/pages/226c21/
关于多数据源的配置同样参考文档 https://baomidou.com/pages/a61e1b/
我之前写过一篇关于 SpringBoot 多数据源配置的文章,里面写到了关于 Mybatis以及 Mybatis generator 的集成问题。参考https://chen-shang.github.io/2023/07/26/shu-ju-ku/springboot-duo-shu-ju-yuan-pei-zhi/
但是,这里用的是Mybatis Plus,情况有不一样了。官方的配置我没有试过,但是如果还是按照 Mybatis 那样的配置来配置Mybatis Plus 的话,虽然服务启动没有问题,但是服务启动后访问Mapper的时候依旧会提示
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.server.dal.mapper.demo.AccountMapper.insertSelective
原因是
@Configuration
@MapperScan(basePackages = "com.server.dal.mapper.study", sqlSessionFactoryRef = "datasource2SqlSessionFactory")
public class Datasource2Config {
@Bean
@Qualifier("datasource2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.study")
public DataSource datasource2DataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory datasource2SqlSessionFactory(@Qualifier("datasource2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/study/*.xml"));
return sessionFactory.getObject();
}
}
中 的SqlSessionFactoryBean用的是 SqlSessionFactoryBean ,如果改成 MybatisSqlSessionFactoryBean 的话,问题就解决了,而且支持原来mybatis的一切配置,似的项目中利用mybatis-generator生成的代码和使用Mybatis Plus生成的Mapper啊,xml啊都可以共存。
@Configuration
@MapperScan(basePackages = "com.server.dal.mapper.demo", sqlSessionFactoryRef = "demoSqlSessionFactory")
public class DemoDatasourceConfig {
@Bean
@Primary
@Qualifier("demoDatasource")
@ConfigurationProperties(prefix = "spring.datasource.demo")
public DataSource demoDatasource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean
public SqlSessionFactory demoSqlSessionFactory(@Qualifier("demoDatasource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/demo/*.xml"));
return sessionFactory.getObject();
}
}