问题描述:
在SpringBoot整合Mybatis的环境下执行SQL时报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
application.yml文件
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3307/flying_ping?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: root
password: root
web:
resources:
static-locations: classpath:static
mybatis:
mapper-locations: com/test/mapper/*.xml
type-aliases-package: com.test.pojo
configuration:
map-underscore-to-camel-case: true
看起来也没错,难道这些映射文件压根就没有编译进去吗?所以我跑到classpath目录去看了一下
果然不出我所料,SpringBoot没有将src/main/java/下的xml文件编译进来。。。
原因分析:
在网上查找资料得知,这并不是SpringBoot的错,而是IDEA的错,误会SpringBoot了呀!!!
IDEA的maven项目中,默认源代码目录下(src/main/java目录)的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉。如果使用的是Eclipse,Eclipse的src目录下的xml等资源文件在编译的时候会自动打包进输出到classes文件夹。
解决方案:
解决方案有多种
- 第一种:需要在pom.xml中添加如下插件
<build>
<resources>
注意这里要给springBoot指定需要打包的静态资源。否则SpringBoot将找不到配置文件
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
这种方式在项目实战中还是比较常用且靠谱的
- 第二种:将mapper.xml文件放在resource目录下
如果没有什么特殊场景,也就是你仅仅只是练习就将mapper.xml放在resources包下。因为MAVE默认在编译的时候会将resources包下的文件也编译到classpath下
如图
同时将properties文件或yml文件中的配置改为
mybatis.mapper-locations=classpath:mapper/*.xml