(1)问题描述
最近在搭建SpringBoot聚合工程时候,集成MyBatis后,启动工程,访问数据库,出现如下错误:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.gitee.app.test.TestService.getAll
大致意思:mybatis绑定异常,无效绑定语句(未找到):没有找到getAll()方法
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.gitee.app.test.TestService.getAll
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.9.jar:3.5.9]
at org.apache.ibatis.binding.MapperMethod.<init>(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.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) ~[na:1.8.0_211]
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.$Proxy58.getAll(Unknown Source) ~[na:na]
(2)解决方案
找了很久问题出在哪里了,百度了一些相关的资料,大部分结论都说mapper和xml映射文件需要满足几个条件,如下所示:
MyBatis报错【Invalid bound statement (not found)】的几种问题排查情况
第一种情况
- xml映射文件中的namespace路径和mapper接口不相同。
解决办法:修改namespace的属性值和mapper接口包路径相同即可。
第二种情况
- mapper接口中定义的方法名称,与xml映射文件中的【id】属性值不相同。
- mapper接口中定义的方法参数,与xml映射文件中的【parameterType】属性值不同。
解决方案:查看mapper接口中的方法名称、参数类型,是否和xml映射文件中定义的id、parameterType属性值相同,不相同则修改成一样的即可。
第三种情况
- mapper接口中定义了某个方法,xml映射文件中没有对应的SQL执行语句也会报错。
解决方案:在xml映射文件中,添加接口方法对应的SQL执行语句。
第四种情况
对应的xml映射文件写在【src/main/java】目录下面,通过maven打包后,没有打包到target目录里面
解决方案:pom文件中添加【resources】标签,将资源一起打包到target目录里面,依赖代码如下。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.yml</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.yml</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
以上,大致就是mybatis出现【Invalid bound statement (not found)】的解决方案。
很可惜,上面几种方式,没能解决我遇到的错误,我的错误原因在下面这种情况。
上面几种方式我都试过了,还是不行,启动时候还是报错【Invalid bound statement (not found)】。想了很久,发现是@MapperScan扫描的包有问题,具体什么问题呢?继续看下面的文字。
我在搭建聚合工程的时候,mapper子工程和其他子工程的包路径都是【com.gitee.app】,于是我配置的【@MapperScan(value=”com.gitee.app.*”)】是这样子的。
那程序运行过程中,这里为什么会报错呢?
因为@MapperScan会扫描对应包下面的接口,然后MyBatis根据接口生成相应的实现类,这样通过实现类去执行相应的SQL语句,而我【com.gitee.app】包下面,不仅有mapper接口,还有service接口,所以导致MyBatis将service接口也作为Mapper接口,然后运行时候,去找service接口对应的xml映射文件,发现没有,于是报错【Invalid bound statement (not found)】。
解决方案:将mapper接口所在的包路径和其他接口区分开来,比如:mapper接口专门放在【com.gitee.app.mapper.*】的包路径下,其他即可就不要放在相同包下面。
修改之后,再次启动项目,通过MyBatis访问数据库,完美解决。
以上,就是我在搭建SpringBoot聚合工程的时候,集成MyBatis出现绑定异常的问题解决,希望对大家有用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134766.html