org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

本文解决了一个关于 Spring Boot 2.0 中使用 MyBatis 的多数据源配置时出现的 BindingException 错误。通过调整 @MapperScan 注解的使用方式和限定扫描范围,成功解决了服务接口被误注册的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx.xxx.xxx.service.ReDemoService.selectByPrimaryKey

spring boot 2.0 做 mybatis 多数据源配置出了以上错误:

网上给出3种解决方案:

1.xxxMapper.xml 中namespace和接口不一致导致.

2.MapperLocations没有扫描到xml文件.

3.idea的坑,pom.xml配置resource将xml文件打包的时候加入到类路径下

可是~... 3种都试了.都不能解决bug.最后发现一个问题

ReDemoService.selectByPrimaryKey() .service接口怎么被mybatis注册为映射接口了


针对如图目录结构. 所以在整合扫包的时候要强制限定扫描规则

java bean 配置方式

@Configuration
@MapperScan(basePackages = "com.mm2s",annotationClass = Mapper.class) // 需要在接口上加上Mapper注解
//@MapperScan(basePackages = "**.mapper")
public class MybatisReConfig {

    @Primary
    @Bean("reDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.h2-re")
    public DataSource reDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public SqlSessionFactory reSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(reDataSource());
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath:mybatis/ReMappings/**/*Mapper.xml"));
        factoryBean.setConfigLocation(resolver.getResource("classpath:mybatis/mybatis-config.xml"));
        return factoryBean.getObject();
    }

    @Bean
    @Primary
    public SqlSessionTemplate reSqlSessionTemplate() throws Exception {
        return new SqlSessionTemplate(reSqlSessionFactory());
    }

}

xml 配置方式

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
          p:dataSource-ref="dataSource"
          p:mapperLocations="classpath:mybatis/mappers/*.xml">
    </bean>

	<!-- 扫描项目包下含有Mapper注解的类作为mybatis的映射接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:basePackage="com.mm2s"
          p:annotationClass="org.apache.ibatis.annotations.Mapper"
          p:sqlSessionFactoryBeanName="sqlSessionFactory"/>
		  
	<!-- 扫描名为mapper包下的类作为mybatis的映射接口  
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:basePackage="**.mapper"
          p:sqlSessionFactoryBeanName="sqlSessionFactory"/> -->

解决方法4: 

   @MapperScan中加入扫包限定annotationClass = Mapper.class  在xxxMappr加入@Mapper

   @MapperScan扫描包名为mapper下的类 basePackages = "**.mapper"

### 解决 `org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)` 错误 当遇到 `org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)` 这一错误时,通常意味着 MyBatis 无法找到指定的 SQL 映射语句。以下是几种常见的解决方案: #### 方法一:确保 Mapper 文件中的 SQL 语句 ID 和 Java 代码中调用的方法名一致 如果 Mapper 接口中的方法名称与对应的 XML 配置文件内的 `<select>` 或其他标签下的 id 属性不匹配,则会触发此异常。因此,应当仔细核对两者之间的命名是否完全相同。 ```xml <!-- UserMapper.xml --> <select id="getUserById" parameterType="int" resultType="com.example.User"> SELECT * FROM users WHERE user_id = #{userId} </select> ``` ```java //UserMapper.java public interface UserMapper { @Select("SELECT * FROM users WHERE user_id = #{userId}") public List<User> getUserById(int userId); } ``` 注意,在上面的例子中,`id` 的值应与接口里的函数签名相吻合[^2]。 #### 方法二:确认资源文件被正确打包至 JAR 中 有时即使路径无误,由于 Maven 构建过程配置不当也可能导致此类问题的发生。可以通过检查项目的 `pom.xml` 来验证是否有如下设置来包含所有的映射器XML文件: ```xml <build> <resources> <!-- 添加 resource 节点用于加载 mapper xml 文件 --> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.yml</include> <include>**/*.yaml</include> <include>**/*.xml</include> </includes> </resource> </resources> </build> ``` 此外,还需保证这些文件确实存在于预期的位置,并且在编译后的 jar 包内可以正常访问[^4]。 #### 方法三:升级依赖版本以兼容更高版本框架 对于某些特定情况下,比如使用较新的Spring Boot 版本而MyBatis Plus尚未提供相应支持的时候,可能会因为API变更等原因引发该类异常。此时建议查看官方文档或社区反馈了解是否存在已知的问题以及相应的修复措施;必要时考虑更新相关库到最新稳定版以便获得更好的适配性和性能优化[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值