spring boot 版本:v2.7.8
Mybatis-plus 版本:v3.5.3.1

mapper 方法绑定 xml 文件报错:Invalid bound statement (not found)

报错是因为没有把 Mapper 自定义的方法和 xml 文件中定义的 sql 关联起来。

检查 namespace、id 和 resultType,可以直接跳转到对应的类,都没有问题。

imooc 视频教程 中使用的是 eclipse,但并没有出现问题。 教程中在 yml 中添加了 mapper 的位置:

mybatis-plus:
  mapper-locations:
    - com/mp/mapper/*.xml

这个我有配置,但执行还是会报错:Invalid bound statement (not found)

视频下有一个问答里提到可以修改 mapper 的位置:

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

复制一份 mapper 到 resources 目录下,测试是可以的。实际上,只要在 resources 目录下,即便把 mybatis-plus.mapper-locations 配置项注释掉也是可以正常绑定的。

也就是说,mapper 的 xml 文件直接放在 resources 文件夹下是可以直接使用的。检查一些已有的 springboot 项目,实际情况也印证了这一点。

问答及后续百度的教程里,提到了一种在 pom.xml 文件中配置 resources, 使 xml 文件能够被识别:

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

注意:修改 pom.xml 文件之后需要重载 Maven 项目使其生效。

然后就报错了:Failed to load ApplicationContext...Failed to determine a suitable driver class

百度了多个教程,里面的情况跟当前都不一致。target -> classes 下并没有发现 propertiesyml 等项目配置文件,突然意识到好像没有引入 resources 下的项目配置文件,有可能这样定义之后默认的资源配置就失效了,需要我们在配置的时候把默认的 resources 文件夹和下面的配置文件加入到其中

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    ...

这样,在代码包和资源包下都可以识别 xml 文件。测试发现依然是 Invalid bound statement (not found) 错误。这好像回到了原点,再次检查 yml 文件时突然发现,之前测试是把 mybatis-plus.mapper-locations 配置项注释了。打开注释,再次测试,成功!

完整版的配置:

application.yml :

mybatis-plus:
  mapper-locations:
    - com/mp/mapper/*.xml
    - classpath:mapper/*.xml

pom.xml :

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    ...

注意:filtering 在这里没有起作用,这样配置的 resources 相当于是开了一个白名单,include 进来的是允许访问的资源文件。如果后续想要访问一些其他的静态资源文件,如 htmljscssjpg 等,就需要手动添加。

综上,最好还是将 mapperxml 文件放在默认的 resources 资源文件夹下。这样可以直接访问,无需任何配置。

中间有 maven 更新报错 cannot reconnect,关闭项目重新打开问题就消失了。