SpringBoot聚合工程集成MyBatis报错:Invalid bound statement (not found): com.xxx.xxx.test.TestService.getAll

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 SpringBoot聚合工程集成MyBatis报错:Invalid bound statement (not found): com.xxx.xxx.test.TestService.getAll,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

(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.*】的包路径下,其他即可就不要放在相同包下面。

SpringBoot聚合工程集成MyBatis报错:Invalid bound statement (not found): com.xxx.xxx.test.TestService.getAll

 修改之后,再次启动项目,通过MyBatis访问数据库,完美解决。

SpringBoot聚合工程集成MyBatis报错:Invalid bound statement (not found): com.xxx.xxx.test.TestService.getAll

 以上,就是我在搭建SpringBoot聚合工程的时候,集成MyBatis出现绑定异常的问题解决,希望对大家有用。

SpringBoot聚合工程集成MyBatis报错:Invalid bound statement (not found): com.xxx.xxx.test.TestService.getAll

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134766.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!