1、问题描述
在写了一个很普通的查询语句之后,出现了下面的报错信息
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.oauth.mapper.WxVisitorQrBeanMapper.selectByComIdAndEmpId
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:230) ~[mybatis-3.4.2.jar:3.4.2]
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48) ~[mybatis-3.4.2.jar:3.4.2]
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65) ~[mybatis-3.4.2.jar:3.4.2]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58) ~[mybatis-3.4.2.jar:3.4.2]
at com.sun.proxy.$Proxy220.selectByComIdAndEmpId(Unknown Source) ~[na:na]
at com.xxx.oauth.service.UserServiceImpl.getVisitorQR(UserServiceImpl.java:319) ~[classes/:1.0-UNIWIN]
2、问题分析
遇到问题咱先不慌,瞪大眼睛看看报错信息。
报错的关键词是 Invalid bound statement
,百度翻译一下,是说绑定语句无效。
这是什么意思呢?
脑袋瓜子飞速转动,大脑CPU超负荷运转。。。
突然灵光一现,怀疑可能是在说mapper接口和mapper.xml文件对应不上
于是找到mapper和mapper.xml所在目录点开看看。
这一看就发现不对劲了,xml对应的命名好像更长一些,在仔仔细细的检查一翻后,发现是xml命名中将小r写成了大写的R。
至此,问题得到解决。
3、问题扩展
为了未雨绸缪,防患于未然,将其它可能导致Invalid bound statement
的原因进行整理。
Invalid bound statement
问题的本质是mapper接口和mapper.xml文件映射出错,以下都是可能导致两者映射出错的原因及解决方案:
① mapper.xml中的namespace属性的值和实际的mapper接口的路径不一致。解决办法是瞪大眼睛,仔细检查一下。
② mapper接口中的方法名和mapper.xml中的id属性的值不一致。解决办法是同样是瞪大眼睛,仔细检查一下。
③ 如果以上三种(扩展的两种)情况都排除,那极有可能是target文件夹中,没有将mapper.xml文件编译和构建。针对这种情况, 有两种可能性:
- 可能一:在xml配置文件中,没有指定Maven 构建过程中需要包含的资源文件。
<!-- 添加配置,避免 mybatis 的mapper.xml文件被漏掉 -->
<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>
上面的配置是指定.properties和.xml 后缀的配置文件,放在 src/main/resources 目录下,并且在Maven构建过程中,将它们复制到target构建目录中,以便运行时能够被访问到。
- 可能二:idea在运行时出错了,没有在target中生成xml文件。 这种情况只需 clean删除target文件,然后重新编译启动运行即可。