Mybatis在idea中错误:Invalid bound statement (not found)

本文解决IDEA中Maven项目单元测试时找不到Mapper方法的问题。默认情况下,IDEA不会将源代码目录下的XML资源文件打包进classes文件夹。通过配置Maven的resource部分,可以确保XML文件被正确包含。

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

初次用Idea,在对mapper进行单元测试的时候报错:Invalid bound statement (not found),找不到对应的方法,最后参考了一篇文章解决了问题:http://www.linuxidc.com/Linux/2015-06/118877.htm

IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉。

如果使用的是Eclipse,Eclipse的src目录下的xml等资源文件在编译的时候会自动打包进输出到classes文件夹。Hibernate和Spring有时会将配置文件放置在src目录下,编译后要一块打包进classes文件夹,所以存在着需要将xml等资源文件放置在源代码目录下的需求。

 1  <!--配置Maven 对resource文件 过滤 -->
 2         <resources>
 3             <resource>
 4                 <directory>src/main/resources</directory>
 5                 <includes>
 6                     <include>**/*.properties</include>
 7                     <include>**/*.xml</include>
 8                 </includes>
 9                 <filtering>true</filtering>
10             </resource>
11             <resource>
12                 <directory>src/main/java</directory>
13                 <includes>
14                     <include>**/*.properties</include>
15                     <include>**/*.xml</include>
16                 </includes>
17                 <filtering>true</filtering>
18             </resource>
19         </resources>

### 三级标题:问题原因分析 在使用 MyBatis-Plus 时遇到 `Invalid bound statement (not found)` 错误,通常是因为 MyBatis 无法找到对应的 SQL 映射语句。具体到 `xxxMapper.selectById` 这个方法,其本质是由于 XML 文件中没有定义名为 `selectById` 的 SQL 语句,或者接口与 XML 文件中的命名不一致 [^1]。 此外,该错误也可能发生在调用 `super.listByIds(userIdList)` 方法时,因为 `listByIds` 方法依赖于 `selectById` 来构建查询逻辑,如果找不到这个 SQL 映射,则会抛出异常 [^3]。 ### 三级标题:解决方法 #### 检查 Mapper 接口与 XML 文件的对应关系 确保接口中声明的方法名与 XML 文件中的 `<select>`、`<insert>`、`<update>` 或 `<delete>` 标签的 `id` 属性完全匹配。例如: ```java // Mapper 接口 User selectById(Long id); ``` XML 文件应包含如下内容: ```xml <select id="selectById" resultType="com.example.demo.entity.User"> SELECT * FROM user WHERE id = #{id} </select> ``` 若名称不一致或缺少该 SQL 定义,MyBatis 将无法绑定正确的 SQL 语句 [^4]。 #### 确保 XML 文件被正确加载 检查 Spring Boot 配置文件(如 `application.yml` 或 `application.properties`)是否指定了正确的 mapper XML 路径。典型的配置如下: ```yaml mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml ``` 如果实际路径结构不符合配置中的通配符规则(如文件夹嵌套层级不正确),则会导致 XML 文件未被正确加载 [^5]。 #### Maven 项目资源过滤配置 对于 Maven 项目,需要确保 `pom.xml` 中包含了对资源目录下 `.xml` 文件的处理规则。否则,编译过程中 XML 文件可能不会被复制到最终的 `target/classes` 目录中,导致运行时找不到 SQL 映射。添加如下配置以确保资源被正确处理: ```xml <build> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> ``` 此配置将确保 Java 包下的 XML 文件也被识别并打包进应用中 [^4]。 #### 使用注解方式替代 XML 如果你更倾向于使用注解而非 XML 文件来定义 SQL 语句,可以直接在接口方法上添加相应的注解,例如: ```java @Select("SELECT * FROM user WHERE id = #{id}") User selectById(Long id); ``` 这种方式避免了 XML 文件路径和命名的问题,并且可以快速验证 SQL 是否生效 [^2]。 ### 三级标题:调试建议 1. **启用 MyBatis 日志输出** 在配置文件中开启 MyBatis 的日志功能,可以帮助定位具体的 SQL 加载情况: ```yaml logging: level: com.example.demo.mapper: debug ``` 2. **检查 Mapper 扫描路径** 确保 `@MapperScan` 注解指向了正确的包路径,以便 Spring Boot 可以扫描到所有的 Mapper 接口。 3. **IDE 缓存问题** 有时 IDE(如 IntelliJ IDEA)可能会缓存旧的配置或类文件,清理项目并重新构建可以排除此类干扰。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值