在一次编译运行SpringBoot+MyBatis项目时,发现调用mapper.selectByPrimaryKey方法报错
2023-01-31 14:34:58.419 [http-nio-6010-exec-3] ERROR com.xxx.controller.PostController - Invalid bound statement (not found): com.xxx.orm.mapper.XxxMapper.selectByPrimaryKey
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.orm.mapper.XxxMapper.selectByPrimaryKey
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:108)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:36)
at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:95)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
at com.sun.proxy.$Proxy115.selectByPrimaryKey(Unknown Source)
经检查,对应的Mapper.xml中,确实已经定义过selectByPrimaryKey。那么,为什么会找不到这个绑定关系,那么,问题应该出在Mapper.xml的加载环节。
此时,放开Mybatis的日志打印,配置如下:
mybatis:
mapper-locations: classpath:/mybatis/mapping/*Mapper.xml
configuration:
cache-enabled: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
保存后调试运行项目,输出已加载的Mapper
![](https://i-blog.csdnimg.cn/blog_migrate/1115dbaab4a957fec8c75180f91efde8.png)
由于需要的Mapper不在当前项目,而位于另一个被引入的项目。同时,此处显示未加载,那么,只能是Mybatis的Mapper加载路径设置有误。
检查后发现,路径配置中,classpath后缺少通配符*,导致调试运行时,仅加载了当前项目中的Mapper,而引入项目的Mapper未加载。
果断修改后,保存并运行,Mapper.xml加载正常,调用方法不再报错
mybatis:
mapper-locations: classpath*:/mybatis/mapping/*Mapper.xml
![](https://i-blog.csdnimg.cn/blog_migrate/96265f866c1bc17dfdce317b23d8804b.png)
注:
1、**表示可以表示任意多级目录
2、*表示多个任意字符