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、代码结构
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