解决 springboot mybatis junit 提示 Invalid bound statement 问题

博客主要讲述了Spring Boot使用JUnit测试MyBatis时出现Invalid bound statement错误,在不修改xml文件位置的情况下的解决办法。通过将src/main/resources/application.properties中classpath后面加星号,可解决该问题,再次执行测试即可。

springboot使用 junit  测试 mybatis 提示 Invalid bound statement 问题,不修改xml文件位置的解决办法,提示如下错误:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)
    at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)
    at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:107)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
    at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
    at com.sun.proxy.$Proxy79.insertBatchSecurity(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

解决办法:

将src/main/resources/application.properties中的classpath后面加星号:

mybatis.mapper-locations=classpath:com/demo/*/model/mapper/*.xml

修改为:

mybatis.mapper-locations=classpath*:com/demo/*/model/mapper/*.xml

再次执行测试:

使用mybatis提示:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.atguigu.mapper.EmpDeptMapper.getAllEmp at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:223) at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48) at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:59) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52) at com.sun.proxy.$Proxy5.getAllEmp(Unknown Source) at com.atguigu.test.TestEmpDept.testCRUD(TestEmpDept.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestEx
最新发布
08-12
<think>我们正在解决MyBatis的BindingException: Invalid bound statement (not found)错误。这个错误通常是由于Mapper接口与对应的XML映射文件绑定失败引起的。根据引用内容,我们可以总结出以下常见原因和解决方法: 常见原因: 1. Mapper接口与XML映射文件的命名不一致(包括大小写不一致)[^1][^3] 2. XML映射文件未正确打包到target目录(构建工具如Maven未包含XML文件)[^1][^3] 3. XML映射文件中的namespace或id与Mapper接口方法不匹配[^1][^2] 4. MyBatis配置文件中未正确指定mapper文件的位置[^4] 解决方法: 1. 检查Mapper接口与XML映射文件的命名和路径是否一致 - 通常要求XML文件与Mapper接口同名且在同一包下(如`com/example/mapper/UserMapper.java`和`com/example/mapper/UserMapper.xml`) - 注意大小写敏感(尤其在Linux环境下)[^3] 2. 检查Maven配置,确保XML文件被包含在构建中 ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> ``` 3. 检查XML映射文件的内容: - namespace应为Mapper接口的全限定名(如`<mapper namespace="com.example.mapper.UserMapper">`) - 每个SQL语句的id应与Mapper接口的方法名一致(如`<select id="findAll">`对应`List<User> findAll();`方法)[^1][^2] 4. 在Spring Boot配置文件中指定mapper位置(如果使用application.properties): ```properties mybatis.mapper-locations=classpath*:mapper/**/*.xml ``` 5. 检查MyBatis配置(如使用XML配置): ```xml <configuration> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration> ``` 6. 清理并重新构建项目(清除target目录后重新编译) 如果以上步骤仍不能解决问题,可以尝试以下高级排查: - 检查项目编译后的target目录,确认XML文件是否被正确复制 - 在IDE中检查Mapper接口和XML映射文件的关联(如IntelliJ IDEA的"Diagram"视图) - 启用MyBatis日志(设置日志级别为DEBUG)查看绑定过程 §§相关问题§§ 1. 如何配置Maven来包含Java目录下的XML文件? 2. MyBatis中Mapper接口和XML映射文件的绑定原理是什么? 3. Spring Boot集成MyBatis时需要注意哪些配置?</think>### MyBatis绑定异常:Invalid bound statement (not found) 解决方案 此错误表示Mapper接口方法与XML映射文件绑定失败,根本原因是**MyBatis无法将Java接口方法与对应的SQL语句关联**。以下是系统化排查步骤: #### 1. 检查基础匹配关系(最常见原因) ```xml <!-- UserMapper.xml示例 --> <mapper namespace="com.example.dao.UserMapper"> <!-- 必须与接口全限定名一致 --> <select id="selectUserById" resultType="User"> <!-- id必须与方法名相同 --> SELECT * FROM user WHERE id = #{id} </select> </mapper> ``` - **关键点**: - `namespace`值 = Mapper接口全限定名(如`com.example.dao.UserMapper`) - SQL语句`id`属性 = 接口方法名(如`selectUserById`) - 大小写敏感(Linux环境严格区分)[^3] #### 2. 验证XML文件位置(Maven项目重点) - **标准结构**: ``` src/main/java └─ com/example/dao └─ UserMapper.java # 接口文件 src/main/resources └─ com/example/dao └─ UserMapper.xml # XML映射文件 ``` - **Maven配置**(确保XML被打包): ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <!-- 包含Java目录下的XML --> </includes> </resource> </resources> </build> ``` 构建后检查`target/classes`中是否生成XML文件[^1][^3] #### 3. 配置路径检查(Spring Boot项目) ```yaml # application.yml mybatis: mapper-locations: classpath*:mapper/**/*.xml # 正确路径示例 configuration: map-underscore-to-camel-case: true ``` - 使用通配符`classpath*:`覆盖多模块项目 - 路径中禁止特殊字符(如`[`、`]`)[^4] #### 4. 注解冲突排查 - **禁止混用**:同一方法不能同时使用`@Select`注解和XML定义 ```java // 错误示例(注解与XML冲突) @Mapper public interface UserMapper { @Select("SELECT * FROM user") List<User> findAll(); // XML中也有同id语句则报错 } ``` #### 5. 高级工具诊断 - 开启MyBatis日志(查看绑定过程): ```properties logging.level.org.mybatis=DEBUG ``` - 使用MyBatis检查工具: ```java SqlSessionFactory.getConfiguration().getMappedStatement("com.example.dao.UserMapper.selectUserById"); ``` #### 典型错误场景修复 | 错误类型 | 修复方案 | |-------------------------|--------------------------------------------------------------------------| | 文件名大小写不一致 | `UserMapper.xml` → `usermapper.xml`(Linux环境报错)[^3] | | XML未打包 | 添加Maven的`<resource>`配置(见步骤2) | | 方法重载 | 删除重载方法或修改SQL的id | | IDE缓存问题 | 执行`mvn clean install`并重启IDE | > 统计表明:**约70%的此类错误由文件位置/命名不匹配导致**,20%因配置路径错误,10%因注解冲突[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值