0、配置动态数据源参考博客为:springboot+mybatis整合使用多数据源 博客中的两个实现方法都配置验证了可以通过,第二种方法有些点不太明确,需要加一些配置

吐血了,博客整理完了,突然看mybatis-plus官方文档已经有这个问题的处理方式了

0.1、执行UserSlaveMapper.selectList报错
发生错误如下:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.um.demo.es.mapper.slave.UserSlaveMapper.selectList

0.2、代码结构

yml mysql多数据源 mybatis-plus多数据源配置_yml mysql多数据源

1、代码如下:
1.1、mapper

public interface UserSlaveMapper extends BaseMapper<UserEntity> {

        List<UserEntity> findAll();

    }

1.2、测试mapper

@RunWith(SpringRunner.class)
    @SpringBootTest
    class UserMapperTest {

        @Autowired
        private UserSlaveMapper userSlaveMapper;

        @Test
        public void slaveSelect() {
            List<UserEntity> list= userSlaveMapper.findAll();
            Assert.assertEquals(1, list.size());
            userList.forEach(System.out::println);
        }

        @Test
        public void testSlaveSelect() {
            List<UserEntity> list = userSlaveMapper.selectList(null);
            Assert.assertEquals(1, list.size());
            list.forEach(System.out::println);
        }

    }

1.3、其他配置与博客中差不多

分析与尝试:
尝试:
1、检查myabatis-plus的各种配置,结合2判断无问题
2、调用的selectList为mybatis-plus封装的代码实现,执行findAll自定义的方法没有问题...
3、开始各种条件试错大法,考虑之前试错的对比理解,偷偷在yml中加入配置,居然执行成功了(注意我已经有了自定义的数据源 DataSourceConfiguration、SlaveDataSourceConfiguration)

yml中添加的配置(这是不需要的,加入仅为尝试)

datasource:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: ${MYSQL_URL:jdbc:mysql://localhost:3306/db_master?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true}
      username: root
      password: 123456

分析:
可以明确了解到我所自定义的数据源是无效的,而默认的数据源配置是有效果的。注意到 EsDemoApplication中排除了 ** DataSourceAutoConfiguration.class**(用来配置默认数据源的),但好像并没有效果。

@MapperScan("com.um.demo.es.mapper")
    @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
    public class EsDemoApplication {

        public static void main(String[] args) {
            SpringApplication.run(EsDemoApplication.class, args);
        }

    }

那说明mybatis-plus有自己传入数据源的自动配置,而且不是通过DataSourceAutoConfiguration处理的。那就去找mybatis-plus的自动配置源码阅读一下,最终确定了需要修改自定义的数据源配置

@Configuration
    @MapperScan(basePackages = "com.um.demo.es.mapper.master", sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class DataSourceConfiguration {

        @Primary
        @Bean("masterDataSource")
        @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")
        public DataSource getDataSource() {
            return DataSourceBuilder.create().build();
        }
  
        /**
         * 阅读 mybatis注入dataSource源码,{@link MybatisPlusAutoConfiguration#applyConfiguration(MybatisSqlSessionFactoryBean)},
         *  注意其注入的是 {@link MybatisSqlSessionFactoryBean}, 之前默认注入的为 {@link SqlSessionFactoryBean},
         *  使用默认注入方法会导致无法使用mybatis-plus提供的方法,而自定义的方法却可以使用的问题
         */
        @Primary
        @Bean("masterSqlSessionFactory")
        public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/master/*.xml"));
            return bean.getObject();
        }  

        @Primary
        @Bean("masterSqlSessionTemplate")
        public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
            return new SqlSessionTemplate(sqlSessionFactory);
        }

    }

yml配置如下

spring:
      application:
        name: es-demo

      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT+8
        serialization:
          write-dates-as-timestamps: false
  
      datasource:
        dynamic:
          datasource:
            master:
              driver-class-name: com.mysql.cj.jdbc.Driver
              jdbc-url: ${MYSQL_URL:jdbc:mysql://localhost:3306/db_master?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true}
              username: root
              password: 123456
            slave:
              driver-class-name: com.mysql.cj.jdbc.Driver
              jdbc-url: ${MYSQL_URL:jdbc:mysql://localhost:3306/db_slave?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true}
              username: root
              password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        hikari:
          #最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置 为minimum-idle的值
          maximum-pool-size: 10
          #连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
          connection-timeout: 60000
          #最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
          minimum-idle: 10
          #空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
          idle-timeout: 500000
          #连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
          max-lifetime: 540000
          #连接测试查询
          connection-test-query: SELECT 1

    #配置Mybatis-plus
    mybatis-plus:
      configuration:
        # 开启驼峰命名转换,如:Table(create_time) -> Entity(createTime)。不需要我们关心怎么进行字段匹配,mybatis会自动识别`大写字母与下划线`
        map-underscore-to-camel-case: true
        auto-mapping-behavior: full
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      type-aliases-package: com.um.demo.es.pojo.entity
      mapper-locations: classpath*:/mapper/**/*Mapper.xml
      global-config:
        # 逻辑删除配置
        db-config:
          # 删除前
          logic-not-delete-value: 1
          # 删除后
          logic-delete-value: 0