IDEA Invalid bound statement (not found) 工具引起

本文记录了一位开发者在使用IDEA与MyBatis Plus开发微服务项目时遇到的包结构问题,详细描述了从发现问题、排查原因到最终解决的过程,揭示了IDEA与其他IDE在处理包结构上的差异。
今天在开发项目时遇到了一个让我翻车坑, 具体是什么呢?让我来描述一下啊, 最近在做一个新项目-中台服务系统采用的是微服务架构, 框架新搭建的, 为了快捷开发,我们采用了springboot+mybatisPlus中的代码生成器, 由于我做的一个微项目中涉及到的业务非常复杂,为避免后期会涉及到个别表结构的改动, 因此没有一次生成此微项目所有涉及到的业务表对应的代码, 包名是自己创建的, 这就是问题背景5555
以下开始讲述问题情况
在开发过程中大部分方法都是尽量用mybatisPlus中Wrapper这种可以对表进行操作的方式, 直到这里编写代码自测都是没有问题的, 当业务中不得不是用多表关联时, 自定义编写了一个方法,自测时报bug出现了

调用BaseMapper出现Invalid bound statement (not found)错误

当时就很诧异, 怎么可能?其他功能都没问题,为什么自己编写的会这样?很明显这个bug的意思是找不到, 解决这种问题,我也就不赘述了, 常规来说加扫描注解, 查看路径等等肯定可以搞定, 于是我查看了各个可能导致这个问题的代码及配置例如

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这是我所创建的目录结构,别问为什么要直接写两层包, 统一规范.

核对之后发现没有问题啊, 然后再别的微项目中写一个自定义方法, 没有问题,可以调用,那说明不是整体架构的问题,只是我这个微服务的问题,然后打开其他项目,在结构上一一对比,还是一模一样, 搞不懂啊,最后打算看看是不是编译的时候包没有生成呢?解压生成的包target文件, 发现了该问题,哎呀,这个包怎么变成一个啦?应该是两层啊!此时找到问题,将mapper.product改成mapper/product问题解决了.
在这里插入图片描述

虽然问题解决了, 但还是存在疑问啊,工作这么多年了,怎么会出现这种问题呢?两个包怎么就变成一个包了呢?必须刨根啊, 于是又创建了几个二层包文件,用原点间隔与用斜杠间隔的确是不一样,但是以前用原点间隔就是建立多层包文件啊,不可能出现错误啊,嗯,可能是工具的问题, 以前用的是eclipse, STS等, 现在使用的是Idea, 是不是IDEA这个工具引起的呢?试一下,找出以前使用的工具STS,创建项目创建包,果然如此,不允许使用斜杠,原点间隔出层级,到此问题找到了,什么原因引起的也找到了,IDEA中创建包名可以包含原点,用斜杠分隔包层,还是感觉有点坑啊,因为这么个问题花了一个多小时啊,最可气的是IDEA工具中看文件目录是一样的,也不像STS和eclipse那样表示包文件时会有个三角的角标用于区分.

在这里插入图片描述
小小一个问题罗里吧嗦说了这么多, 嗯, 主要是记录一下, 也是提供一下我解决这个问题时的一个思路吧!逐层深入,逐级排查

此时还有另一个疑问需要确认, 那就是为什么使用mybatisPlus代码生成器生成的代码就能找到文件并且请求运行等等都是没有问题的呢?!而自己创建的扫描就不可以呢?那应该是扫描与处理机制不一样吧?可能根本就没不需要 xml文件一样可以使用吧?!, 下次查一下资料确认一下

### 三级标题:问题原因分析 在使用 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)可能会缓存旧的配置或类文件,清理项目并重新构建可以排除此类干扰。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值