Invalid bound statement (not found) 绑定错误的原因有哪些?
时间: 2023-11-10 08:03:20 浏览: 65
"Invalid bound statement (not found)"是指MyBatis在解析Mapper接口方法时,找不到与之对应的SQL语句。这种错误通常发生在以下情况下:
1. mapper.xml文件中没有定义与Mapper接口方法相对应的SQL语句。
2. mapper.xml文件中存在与Mapper接口方法相对应的SQL语句,但是其id命名错误或者没有按规范定义,导致MyBatis无法识别。
3. Mapper接口方法参数和SQL语句绑定错误,导致无法正确执行。
相关问题
多数据源Invalid bound statement not found
多数据源Invalid bound statement not found是由于在集成mybatis-plus时,Mapper生成的代理类存在,但是调用BaseMapper中如selectById()方法报错所导致的。这个错误通常是由于mybatis-plus的MapperScannerConfigurer扫描到了多个Mapper接口,导致生成的代理类出现了冲突,从而无法正确绑定Mapper接口中的SQL语句。
解决这个问题的方法是在配置MapperScannerConfigurer时,指定不同的basePackage,以避免扫描到重复的Mapper接口。同时,还需要在配置文件中指定每个数据源对应的Mapper接口所在的位置,以确保mybatis-plus能够正确地生成代理类并绑定SQL语句。
以下是解决这个问题的步骤:
1.在配置文件中指定每个数据源对应的Mapper接口所在的位置,例如:
```
mybatis-plus:
mapper-locations:
- classpath*:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
global-config:
db-config:
id-type: auto
type-aliases-package: com.example.demo.entity
datasource:
master:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath*:mapper/*.xml
```
2.在配置MapperScannerConfigurer时,指定不同的basePackage,例如:
```
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.master", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "datasource.master")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@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();
}
@Bean(name = "masterTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "masterSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.slave", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
public class SlaveDataSourceConfig {
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "datasource.slave")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/slave/*.xml"));
return bean.getObject();
}
@Bean(name = "slaveTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "slaveSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
```
3.在Mapper接口中使用@Mapper注解,例如:
```
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
```
mapper绑定成功了 报错Invalid bound statement (not found)
在你的问题中,你提到了一个报错信息"Invalid bound statement (not found)"。根据引用的内容,这个报错信息通常出现在使用MyBatis框架时,表示在mapper接口中绑定的SQL语句无法找到。
这个报错信息的原因可能有以下几种可能性:
1. mapper接口中的SQL语句没有正确命名或者没有在对应的mapper.xml文件中定义。你需要仔细检查mapper接口和对应的mapper.xml文件,确保SQL语句的命名和定义是正确的。
2. mapper.xml文件没有正确配置或者没有被正确加载。你需要检查mybatis-config.xml文件中是否正确配置了mapper.xml文件的路径,并且确保mapper.xml文件在该路径下存在。
3. mapper接口没有在mybatis-config.xml文件中正确注册。你需要检查mybatis-config.xml文件中是否正确配置了mapper接口的路径,并且确保mapper接口已经在该路径下存在。
综上所述,当遇到"Invalid bound statement (not found)"的报错信息时,你可以先检查mapper接口和mapper.xml文件的配置、命名和路径是否正确,并确保它们能够正确加载和注册。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [解决动态SQL报错Invalid bound statement (not found): ……](https://blog.csdn.net/qq_49742153/article/details/129348842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [service层报错Invalid bound statement (not found),但调用mapper层不报错](https://blog.csdn.net/weixin_54348877/article/details/129742486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]