大家好,我是欧阳方超,可以扫描下方二维码关注我的公众号“欧阳方超”,后续内容将在公众号首发。
1、概述
使用MyBatis-Plus时出现了下面的错误,由于查询SQL写在了xml中,打开jar包发现类路径中没有写SQL的xml文件,所以才报这个错误。
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xx.phone.mapper.CeiCompanyMapper.getCompanyBasicInfo
下面的yml中关于MyBatis-Plus的配置:
# MyBatis-Plus配置
mybatis-plus:
mapper-locations: classpath*:com/xxx/xxx/mapper/xml/*.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.xxx.xxx.entity
2、问题分析与解决
那么问题来了,为什么xml文件没打到jar中呢,也就是说为什么没有读到xml文件呢,这要从MyBatis-Plus的默认读取路径说起,MyBatis-Plus 默认从 classpath*:/mapper/**/*.xml 目录读取 XML 映射文件。这意味着它会在类路径下搜索所有名为 mapper 的目录及其子目录中的 XML 文件,具体路径可以通过配置项 mapper-locations 来指定。我所遇到的问题就发生在使用mapper-locations指定了xml的位置,但是却没有在项目pom.xml 文件中用 标签定义项目中的资源文件的处理方式。具体说,需要在pom.xml中添加如下配置片段:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
第一个resource块
<directory>src/main/resources</directory>
: 指定了资源文件的目录。Maven 默认会将 src/main/resources 目录中的所有文件打包到最终的 JAR 或 WAR 文件中。
<filtering>true</filtering>
: 启用过滤功能。这意味着在构建过程中,Maven 会对该目录中的文件进行处理,替换特定的占位符(如 ${project.version})为实际的值。这通常用于配置文件中,以便在不同的环境中使用不同的配置。
第二个 块
<directory>src/main/java</directory>
: 指定了另一个资源目录。在这个例子中,它是 Java 源代码目录,通常不作为资源目录使用,但在这里指定是为了处理其中的 XML 文件。
<includes>
: 这个标签定义了要包含的文件类型。
<include>**/*.xml</include>
: 表示将 src/main/java 目录下及其所有子目录中的所有 XML 文件包含到构建过程中。这意味着这些 XML 文件也会被打包到最终的输出中。
3、总结
如果要自定义xml文件的路径,需要在pom文件中的resources标签内定义项目中资源文件的处理方式,否则会读不到xml文件,导致报错。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。