mybatis plus Invalid bound statement (not found) 多数据源
记录 mybatis plus 配置多数据源的坑,结合浏览过的文章,并且一步步排错后,把问题定位到了多数据源配置文件上。我把浏览过的文章放到下面连接,如果按照作者的不做没解决,可根据下面的几篇文章进行排错。参考文章连接Invalid bound statement (not found) 异常原因Invalid bound statement (not found) 终极解决办法Invalid b
·
记录 mybatis plus 配置多数据源的坑,结合浏览过的文章,并且一步步排错后,把问题定位到了多数据源配置文件上。我把浏览过的文章放到下面连接,如果按照作者的不做没解决,可根据下面的几篇文章进行排错。
参考文章连接
- Invalid bound statement (not found) 异常原因
- Invalid bound statement (not found) 终极解决办法
- Invalid bound statement (not found): 各种原因
- 引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行【本文解决采用方案】
作者配置了两个数据源,数据源使用的是 阿里的 druid 数据源,我在下面贴出错误配置和正确配置。仅供参考。
错误配置
// 主数据源
@Configuration
@EnableConfigurationProperties(UserDataSourceProperties.class)
public class AuthDataSourceConfig {
@Autowired
private AuthDataSourceProperties properties;
@Primary
@Bean("authDataSource")
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(properties.getDriverClass());
dataSource.setUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
return dataSource;
}
@Primary
@Bean(name = "authTransactionManager")
public DataSourceTransactionManager clusterTransactionManager(@Qualifier("authDataSource") DataSource authDataSource) {
return new DataSourceTransactionManager(authDataSource);
}
@Primary
@Bean("authSqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory(@Qualifier("authDataSource") DataSource authDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(authDataSource);
return sessionFactory.getObject();
}
}
// 从数据源
@Configuration
@MapperScan(basePackages = "com.yutangcun.oauth.mapper.user", sqlSessionFactoryRef = "userSqlSessionFactory")
@EnableConfigurationProperties(UserDataSourceProperties.class)
public class UserDataSourceConfig {
@Autowired
private UserDataSourceProperties properties;
@Bean("userDataSource")
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(properties.getDriverClass());
dataSource.setUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
return dataSource;
}
@Bean(name = "userTransactionManager")
public DataSourceTransactionManager clusterTransactionManager(@Qualifier("userDataSource") DataSource authDataSource) {
return new DataSourceTransactionManager(authDataSource);
}
@Bean("userSqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory(@Qualifier("userDataSource") DataSource authDataSource) throws Exception {
// 错误配置只有这个地方
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(authDataSource);
return sessionFactory.getObject();
}
正确配置
// 主数据源
@Configuration
@EnableConfigurationProperties(UserDataSourceProperties.class)
public class AuthDataSourceConfig {
@Autowired
private AuthDataSourceProperties properties;
@Primary
@Bean("authDataSource")
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(properties.getDriverClass());
dataSource.setUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
return dataSource;
}
@Primary
@Bean(name = "authTransactionManager")
public DataSourceTransactionManager clusterTransactionManager(@Qualifier("authDataSource") DataSource authDataSource) {
return new DataSourceTransactionManager(authDataSource);
}
@Primary
@Bean("authSqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory(@Qualifier("authDataSource") DataSource authDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean ();
sessionFactory.setDataSource(authDataSource);
return sessionFactory.getObject();
}
}
// 从数据源
@Configuration
@MapperScan(basePackages = "com.yutangcun.oauth.mapper.user", sqlSessionFactoryRef = "userSqlSessionFactory")
@EnableConfigurationProperties(UserDataSourceProperties.class)
public class UserDataSourceConfig {
@Autowired
private UserDataSourceProperties properties;
@Bean("userDataSource")
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(properties.getDriverClass());
dataSource.setUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
return dataSource;
}
@Bean(name = "userTransactionManager")
public DataSourceTransactionManager clusterTransactionManager(@Qualifier("userDataSource") DataSource authDataSource) {
return new DataSourceTransactionManager(authDataSource);
}
@Bean("userSqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory(@Qualifier("userDataSource") DataSource authDataSource) throws Exception {
// 正确配置
final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(authDataSource);
return sessionFactory.getObject();
}
注意这里,有一个数据源,我是不需要用mybatis plus 所以我没有把 SqlSessionFactoryBean 换成 MybatisSqlSessionFactoryBea,如果两个数据源都需要用到mybatis plus 则参考 从数据源的配置,两个配置都是一样的,并且使用 @Primary 标识主数据源,不然会报错
修改数据源配置后,就解决了这个问题,世界也美好了。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)