文章目录
本文主要讲述两个问题:
- 使用Mybatis-Plus过程中出现mapper.xml文件无法找到,导致
Invalid bound statement (not found)
- 在pom.xml中<build>加入<resource>后,出现java/main/resource/static下静态文件夹无法找到
环境介绍
编译器 : Eclipse 2020-03
框架:SpringBoot 2.2.5、 Mybatis-Plus 3.3.2
代码结构:父工程parent,子工程admin和service,service工程以jar包编译,admin工程以war包编译,admin.war中包含service.jar
parent
|-- pom.xml
|-- admin
|-- src
| |-- main
| |-- java
| | |-- com
| | |-- lizzy
| | |-- controller
| | -- UserController.java
| | -- Appliation.java
| |-- resources
| `-- application.yml
|-- pom.xml
|-- service
|-- src
| |-- main
| |-- java
| | |-- com
| | |-- lizzy
| | |-- mapper
| | |-- xml
| | |-- UserMapper.xml
| | |-- UserMapper.java
| | |-- Appliation.java
| |-- resources
| |-- static
| |-- xxx.json
|-- pom.xml
父工程名 | 子工程名 | 子工程特殊目录 | 子工程特殊目录说明 |
---|---|---|---|
parent | - | - | - |
- | admin | - | - |
- | - | java/main/src/com/lizzy/mapper/xml/*.xml | mapper.xml路径 |
- | - | java/main/src/com/lizzy/mapper/**Mapper.xml | xxxMapper.java路径 |
- | - | java/main/resources/application.yml | 设置mybatis-plus配置mapper-locations |
- | service | - | - |
- | - | pom.xml | 设置编译源码中xml文件 |
NOTE:特殊说明,工程打包部署后,service是以jar包方式编译入admin.war包中!
pom依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
mybatis-plus配置
mybatis-plus:
type-aliases-package: com.lizzy.model # 扫描实体类包
mapper-locations: com/lizzy/mapper/xml/**.xml
问题一:Invalid bound statement (not found)
按着错误提示信息,是因为找不到对应的mapper.xml文件,查询原因后,从官方网站常见问题-自定义 SQL 无法执行上找到了原因,对于IDEA系列编辑器,XML 文件是不能放在 java 文件夹中的,IDEA 默认不会编译源码文件夹中的 XML 文件,官方给出两种解决方法:
- 将配置文件放在 resource 文件夹中
- 对于 Maven 项目,可指定 POM 文件的 resource
本文采用的是第二种方式,在pom中进行编译设置:
<build>
<resources>
<resource>
<!-- xml放在java目录下-->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--指定资源的位置(xml放在resources下,可以不用指定)-->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
本地测试ok,跑流水线部署到linux机器上也ok,完美解决问题!但。。。前端反馈,部分访问静态文件的接口崩溃了!!!Oh no!
问题二:pom进行编译设置后,resources下静态文件无法访问
勇敢的程序媛不怕困难!查看war包发现缺少static文件夹,让我们仔细看下刚刚的<\build>配置,于是进行了如下修改:(对resource相关配置不是很清楚,理论还需继续深入 TODO)
<resources>
<resource>
<!-- xml放在java目录下 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!--指定资源的位置(xml放在resources下,可以不用指定) -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
总算解决了问题!
后记
知识盲区太多啦,mark下 ~
mapper-locations 配置
Locations of Mapper xml config file. 标识mapper.xml文件位置
mapper-locations: classpath:mapper/*.xml
与 mapper-locations: classpath*:mapper/*.xml
是有区别的
classpath:
会扫描本工程源码中mapper/*.xml
文件,不包括jar包
classpath*:
会扫描所有源码包下mapper/*.xml
文件,包括jar包
pom resource和filtering – 待补充
Maven 资源文件(Resources)的打包(package)与过滤(filter)
默认情况下 <filtering> 为 false
网上的解决方案
将mapper.xml文件移到resources下
项目属于架构大杂烩,目前是在重构阶段,文件夹变更有难度,所以放弃了!
将mapper.xml文件移到xxxMapper.java 同层 – 待验证
参考文档-mybatis 整合spring之mapperLocations配置的问题
结论是:如果Mapper.xml与Mapper.class在同一个包下且同名,spring扫描Mapper.class的同时会自动扫描同名的Mapper.xml并装配到Mapper.class。
如果Mapper.xml与Mapper.class不在同一个包下或者不同名,就必须使用配置mapperLocations指定mapper.xml的位置。
此时spring是通过识别mapper.xml中的 namespace的值来确定对应的Mapper.class的。
这篇文章只是个简单的记录,若有不对的地方,欢迎指正~~