Mybatis绑定异常:无效绑定语句未找到问题求助
错误信息
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mysite.hrmanager.repository.mapper.MstBizExpMapper.selectAll
at org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:235) ~[mybatis-3.5.9.jar!/:3.5.9]
at org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:53) ~[mybatis-3.5.9.jar!/:3.5.9]
at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:108) ~[mybatis-3.5.9.jar!/:3.5.9]
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705) ~[na:na]
at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:35) ~[mybatis-3.5.9.jar!/:3.5.9]
at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:95) ~[mybatis-3.5.9.jar!/:3.5.9]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) ~[mybatis-3.5.9.jar!/:3.5.9]
at com.sun.proxy.$Proxy82.selectAll(Unknown Source) ~[na:na]
at com.mysite.hrmanager.service.MstBizExpService.selectAll(MstBizExpService.java:23) ~[classes!/:na]
at com.mysite.hrmanager.controller.DemoController.fetchExpsDetailList(DemoController.java:32) ~[classes!/:na]
核心原因及解决方法
1. Mapper XML未被Gradle打包(最可能原因)
你的Mapper XML文件放在src/main/java下的包路径中,但默认Gradle不会将Java源码目录下的XML文件复制到编译后的输出目录,导致MyBatis无法读取到映射文件。
解决:在build.gradle中添加资源配置,让Gradle扫描并打包Java目录下的XML文件:
sourceSets { main { resources { srcDirs 'src/main/java' include '**/*.xml' } } }
2. 缺少MyBatis基础配置
当前application.properties中没有指定MyBatis的Mapper文件位置和实体类别名包,补充配置可确保MyBatis正确加载映射文件:
解决:在application.properties中添加:
mybatis.mapper-locations=classpath:com/mysite/hrmanager/repository/mapper/*.xml mybatis.type-aliases-package=com.mysite.hrmanager.entity
3. SQL语句错误(额外问题)
当前XML中的SQL语句select * from engineer_id存在问题,engineer_id是字段名而非表名,应替换为实际业务表名(比如mst_biz_exp),否则绑定成功后会触发表不存在的错误:
修正SQL:
<select id="selectAll" resultMap="mstBizExpMapper"> select * from mst_biz_exp </select>
4. 确认Mapper匹配规范(当前代码已符合,需持续遵循)
- 确保Mapper XML的
namespace与接口全类名完全一致 - 确保XML中SQL标签的
id与接口方法名完全一致 - 确保Mapper接口添加了
@Mapper注解
内容的提问来源于stack exchange,提问作者user19703189

