Mybatis-Plus 踩坑记之Invalid bound statement及mapper-locations配置

11 篇文章 0 订阅
3 篇文章 0 订阅

本文主要讲述两个问题:

  1. 使用Mybatis-Plus过程中出现mapper.xml文件无法找到,导致 Invalid bound statement (not found)
  2. 在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/*.xmlmapper.xml路径
--java/main/src/com/lizzy/mapper/**Mapper.xmlxxxMapper.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/*.xmlmapper-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的。

这篇文章只是个简单的记录,若有不对的地方,欢迎指正~~

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值