mybatis报错:Invalid bound statement (not found):

本文解决了MyBatis中因无法找到指定Mapper而导致的应用错误问题。通过在pom.xml文件中正确配置资源路径,确保了MyBatis可以读取位于src/main/java目录下的xxxMapper.xml文件。

错误提示:

严重: Servlet.service() for servlet [springmvcServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.mapper.EmployeeMapper.selectByPrimaryKey] with root cause

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.mapper.EmployeeMapper.selectByPrimaryKey

 

 

问题所在mybatis中的xxxMapper.xml 文件因为在src/main/java无法读取;需在pom.xml文件中添加如下代码

注: 只配置单个src/main/java 或者 src/main/resources,将报错:No mapping found for HTTP request with URI

代码如下:

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
        </resource>
    </resources>
</build>

 

 

 

 

 
 
 
<think>嗯,用户遇到了Spring Boot整合MyBatis时经典的"Invalid bound statement (not found)"错误,这问题我处理过很多次了。从用户提供的引用和问题描述来看,用户应该是在开发中遇到了MyBatis找不到Mapper映射文件的问题。 用户引用的资料很有针对性,基本涵盖了常见原因:引用[2]提到目录结构错误,引用[3]是关于配置路径的问题,引用[4]则指出编译时文件遗漏。这些都是排查的重点方向。用户可能是个中级开发者,能提供具体错误堆栈和配置片段,但对资源文件的编译机制还不够熟悉。 这个问题本质上是路径匹配问题。需要重点检查三个地方:首先是XML文件的实际存放路径是否与配置一致,特别是classpath*:后面的路径表达式;其次是文件命名是否规范,比如是否使用了Mapper.xml后缀;最后要确认编译后target目录里是否生成了对应的XML文件。 用户可能已经尝试过修改配置但没解决问题,所以我的回答要提供阶梯式的排查步骤。第一步建议用最直观的目录检查法,因为很多开发者会忽略"mybatis/mapper"和"mybatis.mapper"的区别。第二步要强调配置的精确匹配,特别是通配符的使用。第三步要教用户验证编译结果,这是最可靠的验证方式。 考虑到用户可能着急解决问题,在回答里要避免过多理论,直接给出可操作步骤。最后补充的配置示例很重要,因为很多人会忽略type-aliases-package的配置影响。 对了,还要提醒用户检查Mapper接口的注解扫描配置,虽然引用里没提,但@MapperScan缺失也可能引发类似现象。这个问题通常不难解决,但需要耐心排查路径细节。 </think> 出现“Invalid bound statement (not found)”错误的主要原因是 **MyBatis 无法找到与 Mapper 接口方法对应的 SQL 映射语句(XML 文件或注解)**。根据引用信息,结合常见情况,以下是详细的排查步骤和解决方案: --- ### 🔍 **核心原因 & 解决方案** #### **1. Mapper XML 文件未被正确扫描 (最常见)** * **原因:** Spring Boot/MyBatis 配置中指定的 XML 文件路径 (`mapper-locations`) 与实际存放位置不匹配,或者文件未被正确编译到 `target/classes` 目录。 * **解决方案:** * **检查配置文件路径:** 确保 `application.yml`/`application.properties` 中的配置路径 **精确匹配** XML 文件的实际位置 (尤其注意目录分隔符 `/` 和通配符 `*`)。引用[3]展示了正确配置: ```yaml mybatis-plus: mapper-locations: classpath*:/mapper/*Mapper.xml ``` * `classpath*:`:搜索**所有**类路径(包括 JAR 包)。 * `/mapper/`:资源目录下的 `mapper` 文件夹。 * `*Mapper.xml`:所有以 `Mapper.xml` 结尾的文件。 * **检查实际目录结构:** * **资源目录结构:** 在 `src/main/resources` 下,你的 XML 文件路径应**严格匹配**配置中的路径。如配置为 `classpath:/mybatis/mapper/*.xml`,则 XML 文件必须位于 `resources/mybatis/mapper/` 下。 * **⚠️ 关键陷阱 (引用[2]):** 在 IDE (如 IntelliJ IDEA) 中创建 `resources/mybatis/mapper` 目录时: * **错误方式:** `new -> Package` 创建 `mybatis.mapper` 包(这会在 `resources` 下生成名为 `mybatis.mapper` 的**单个目录**,而不是嵌套的 `mybatis/mapper` 目录)。 * **正确方式:** `new -> Directory` 创建 `mybatis`,然后进入 `mybatis` 再创建 `mapper` 子目录。或者在资源管理器里直接创建正确的层级目录。 * **检查编译后输出 (`target/classes`):** 这是**最可靠的验证** (引用[4])。编译项目后,检查 `target/classes` 目录下是否存在预期的 XML 文件及其正确的子目录结构。如果不存在,说明文件未被正确复制或扫描。确保: * XML 文件放置在 `src/main/resources` 或其正确子目录下。 * 构建工具 (Maven/Gradle) 配置正确,没有过滤掉 XML 文件。对于 Maven,确保 `<build>` 中的 `<resources>` 包含: ```xml <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <!-- 确保包含 XML 文件 --> </includes> <filtering>true</filtering> </resource> ``` #### **2. Mapper 接口未被扫描注册** * **原因:** Spring Boot 未找到你的 Mapper 接口,无法为其创建代理对象。 * **解决方案:** * **添加 `@Mapper` 注解:** 在**每个** Mapper 接口上添加 `@Mapper` 注解。 * **添加 `@MapperScan` 注解 (更推荐):** 在主启动类 (`@SpringBootApplication` 注解的类) 上添加 `@MapperScan`,指定 Mapper 接口所在的**包路径**: ```java @SpringBootApplication @MapperScan("com.lsj.sbv_wms.mapper") // 替换为你的实际 Mapper 接口包名 public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` * **确保包名正确无误。** * 使用 `@MapperScan` 可避免在每个 Mapper 接口上写 `@Mapper`。 #### **3. XML 文件中 SQL 的 id 与 Mapper 接口方法名不匹配** * **原因:** `<select id="...">`, `<insert id="...">` 等标签中的 `id` 属性值必须 **严格等于** 对应的 Mapper 接口中的**方法名**。 * **解决方案:** * **仔细核对:** 打开 XML 文件,检查每个 SQL 语句标签的 `id` 是否与 Mapper 接口中定义的方法名**完全一致**(区分大小写)。 #### **4. Maven/Gradle 资源过滤问题 (XML 未复制到 target)** * **原因:** 构建过程中,`src/main/resources` 下的 XML 文件未被正确复制到 `target/classes` (或等效的输出目录)。 * **解决方案 (Maven):** 确保 `pom.xml` 中的 `<build>` 配置正确包含 XML 文件: ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <!-- 关键: 包含所有 XML --> <include>**/*.properties</include> <include>**/*.yml</include> </includes> <filtering>true</filtering> <!-- 如果需要变量替换 --> </resource> </resources> ... (plugins) </build> ``` * **解决方案 (Gradle):** 确保 `build.gradle` 正确配置资源处理: ```groovy sourceSets { main { resources { srcDirs = ["src/main/resources"] includes = ["**/*.xml", "**/*.properties", "**/*.yml"] // 包含 XML } } } ``` #### **5. XML 文件命名或位置不规范** * **原因:** XML 文件名或放置位置不符合约定或配置。 * **解决方案:** * **遵循约定:** 通常建议将 XML 文件放在 `resources/mapper` 或类似目录下,文件名与对应的 Mapper 接口名保持一致 (如 `UserMapper.xml` 对应 `UserMapper.java`)。确保配置 (`mapper-locations`) 能覆盖这些文件。 #### **6. 其他可能原因** * **命名空间 (`namespace`) 错误:** XML 文件中的 `<mapper namespace="...">` 属性值必须是 M XML 文件中的 `<mapper namespace="...">` 属性值必须是 Mapper 接口的**全限定类名** (包括包名),且必须**完全匹配**。 * **IDE 缓存:** 尝试清理项目 (`mvn clean` / `gradle clean`) 并重新构建,有时 IDE 缓存会导致问题。 * **多模块项目:** 如果使用多模块,确保 Mapper 接口和 XML 文件在同一个模块中,或者配置能正确扫描到依赖模块中的资源 (可能需要特殊配置如 `classpath*:` 和模块路径)。 --- ### ✅ **推荐检查流程** 1. **验证 `target/classes`:** 编译后立即检查 `target/classes` 下是否有 XML 文件及其路径是否与配置的 `mapper-locations` **完全匹配**。这是**最直接有效**的验证方法 (引用[4])。 2. **检查配置文件:** 仔细核对 `application.yml`/`application.properties` 中的 `mybatis.mapper-locations` 或 `mybatis-plus.mapper-locations` 配置,确保路径和通配符正确。 3. **检查目录结构:** 在 `src/main/resources` 下,确认目录层级是按 `/` 分隔的真实目录 (如 `mybatis/mapper`),而不是 `.` 分隔的包名目录 (如 `mybatis.mapper`) (引用[2])。 4. **检查 `@MapperScan`:** 确认主启动类上有 `@MapperScan` 注解,并且指定的包路径包含了你所有的 Mapper 接口。 5. **检查 SQL ID 与方法名:** 打开一个报错的 Mapper 接口及其对应的 XML 文件,核对方法名和 XML 中对应 SQL 语句的 `id` 是否**完全一致**。 6. **检查命名空间:** 确认 XML 文件中的 `namespace` 属性值是 Mapper 接口的全限定类名。 7. **清理并重建:** 执行 `mvn clean install` 或 `gradle clean build`,确保最新代码和资源被编译。 --- ### ⚙️ **正确配置示例 (application.yml)** ```yaml mybatis: mapper-locations: classpath*:/mapper/**/*.xml # 灵活匹配多层目录下的xml # type-aliases-package: com.example.model # 如果使用别名可配置 configuration: map-underscore-to-camel-case: true # 根据需要开启驼峰映射 ``` ```yaml # 使用 MyBatis-Plus mybatis-plus: mapper-locations: classpath*:/mapper/*Mapper.xml # 常见配置 type-aliases-package: com.example.entity # 实体类包 configuration: map-underscore-to-camel-case: true ``` --- 通过以上步骤,绝大多数 `Invalid bound statement (not found)` 错误都能被定位和解决。重点在于 **路径匹配** 和 **编译后验证**。[^1][^2][^3][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值