记一次SpringBoot整合MyBatis时找不到Mapper.xml的BUG定位

Posted AlaGeek

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次SpringBoot整合MyBatis时找不到Mapper.xml的BUG定位相关的知识,希望对你有一定的参考价值。

1、前因

最近开始写我的博客系统了,想着先把登录注册功能写了,框架采用SpringBoot+SpringSecurity+MyBatis,于是想着先把SpringBoot和MyBatis整合,谁知道,这一整合就整出问题了。

2、BUG定位

首先先给大家复现下我的BUG,下面是我的工程结构:

这个代码是没问题,但是启动项目的时候就报了个错,这个错叫“Invalid bound statement(not found) ”,我百度了下,是说Mapper.xml文件没找到,有人说是因为Mapper.xml文件在java文件夹下,所以没有被识别,于是我在pom文件加了如下代码:

<build>
   <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

这个代码告诉Maven工程,我在Java文件夹下面有xml文件,你别给我识别漏了,再运行工程,还是报错,但是我一看target文件夹,确实识别到了Mapper.xml文件:

由于没有思路,我打开了之前学习SpringBoot整合MyBatis的工程,将两者进行了对比,发现了一个问题,请看两个工程结构图:


看出来问题没,正确工程的Mapper接口和Mapper.xml文件是在一个包下面的,而报错的工程,我将Mapper.xml单独抽了个包出来,好家伙,强迫症使我写BUG!
对于这个问题,我想应该是这样解释的,框架里应该有种机制,由于我在Mapper接口处写了@Mapper注解,所以框架能够识别到我这个接口,同时能够识别在这个包下的同名xml文件,而由于我的强迫症,框架就找不到Mapper.xml文件了。

3、BUG修复

定位到这个问题后,修复也很简单,我把Mapper.xml从mapper包中移出来,都放在dao包下,程序就正确了,如图:

4、后续

这个修复很简单,但是我就是不想把接口跟xml放在一起呢,也有办法解决,那就是把mapper包放到resources文件夹下去,如图:

同时在配置文件中加上这样一句话:

mybatis.mapper-locations=classpath:mapper/*.xml

告诉Maven工程,我的Mapper.xml文件在resources文件夹下的mapper文件夹里,这样就可以了。
那么有小伙伴可能要问了,我就是要把Mapper.xml文件放在java目录下,就是要单独抽个包出来,那该怎么办呢?很遗憾的是,我也不晓得,我尝试了百度的很多方法,都是找不到文件,不知道是bug还是我太菜了。要是有小伙伴知道,麻烦评论里教教我。


哦对,实在是很想吐槽一句,百度到的博客,十篇里面九篇是一样的,抄袭也太严重了吧,喜欢的博客收藏不就好了,加个书签也行啊,自己写一篇,加点自己的理解也行啊,非要一模一样的,找bug的时候,打开七八个博客,全是一样的东西,真的是要吐血了!!!

以上是关于记一次SpringBoot整合MyBatis时找不到Mapper.xml的BUG定位的主要内容,如果未能解决你的问题,请参考以下文章

记一次SpringBoot 开发中所遇到的坑和解决方法

记一次IDEA利用mybatis-generator自动生成dao和mapper

springboot2整合mybatis实例

springboot整合mybatis通用Mapper

执行持续集成时找不到头文件

SpringBoot 整合其他框架 -- SpringBoot整合Mybatis