MyBatis Plus集成Spring Boot


参考官方文档 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();
    }
}

评论