概述
一、问题描述
有时候,当我们使用SpringBoot访问数据库的时候,常常会出现这样的纠结,第一,@Mapper注解、@MapperScan注解的关系是什么,application.properties的
mybatis.mapper-locations的属性值设置与这个两个注解之间有什么关系,尤其是注解与配置文件之间,两者都是设置mybatis的XML文件的位置,那有什么区别呢?也许你能在这找到答案。
二、名词解释
1、@Mapper注解:
这个注解其实就是用来指定XML文件编译后的位置的,如果单独使用的话,XML文件必须与添加了Mapper注解的接口文件名称一致并且在同一个包下,SpringBoot框架会自动在该包下扫描到编译后的XML文件。所有的这些注解都是在编译后的目录中寻找,也就是说,你使用了该注解之后,框架都是在target目录下寻找XML文件的,这一点要尤其注意。
package com.beim.mapper;
import com.beim.entity.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
// 接口文件
@Mapper
public interface StudentDao {
Student queryStudentById(@Param("stuId") Integer id);
}
上面显示了,接口与XML文件在同一个包下,为了保证XML文件能被编译进target目录中,需要在POM文件中添加一个resources插件:
<!--加入 resource 插件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
这里简单的解释一下resources标签的作用,maven目录下不是有一个resources目录吗?那个目录下的不管是什么类型的文件都是可以被编译进target目录下的。这个标签的作用其实就是相当于resources目录的作用:指定哪些文件作为资源文件(被指定的文件是可以被编译进去的)。因此,这里由于StudentDao不在resources目录下,所以你需要指定resources标签,目的就是能把这个标签指定的文件作为资源文件编译进去。
注意:这个标签会将原本的resources目录下的配置文件覆盖掉,也就是说,你原本在resources目录下的配置文件如果不再该标签指定的目录下,是不会被编译进去的。它是以这个标签为高优先级的。
如图:已经成功编译进去。如果不配置的话XML文件是无法编译进去的。
2、@MapperScan注解
这个注解的作用其实就很容易理解了,顾名思义,是一个Mapper扫描器。如果是小型项目的开发,与数据库交互的接口足够少,这时你可以非常从容的在每个接口上都加一个@Mapper注解,但是如果项目十分庞大,一个一个接口添加注解是十分糟糕的一件事,因此,@MapperScan注解就是解决这个问题的。它用来指定存放XML文件的包,直接扫描包下所有的文件。使用它之后接口上的Mapper注解就不需要再添加了。
3、mybatis.mapper-locations
这个属性值是application.properties中的一个key,它也是用来设置XML文件的位置的,到这,你可能会搞混淆,它跟上文两个注解有什么区别呢?
三、三者的区别
要理解三者之间的区别,首先你要明白,XML文件分为编译和运行两个步骤,第一肯定是要先编译的,既然是编译,那么我们先来看一下编译之后的目录结构是怎样的?
大体上的目录结构与你在maven的建立的目录结构差不多,事实上,当将XML文件编译成功之后,在编译后的目录下是可以看到编译之后的XML文件的,如果没有看到,那么你必然是无法运行的,肯定会报错。因为框架都是从编译之后的目录下去找寻文件的。
因此,上文关于@Mapper的使用过程为:当将mapper文件编译成功之后,框架会根据Mapper注解去对应的包下找,也就是com.beim.mapper包下,找寻到了,因此可以正常执行不会报找不到XML文件的异常。@MapperScan注解的执行过程也类似,唯一不同的是,Mapper扫描是在你指定的包下找寻。
好,回到mybatis.mapper-locations这个属性的设置,它其实针对的是将XML文件放置到resources目录下的设置,如下所示,
这时,我们编译成功之后再来看target目录:
XML文件跑到了与com同级下的mapper目录下了,而这个目录是上文那两个注解所无法扫描到的地方,因此,这就需要用mybatis.mapper-locations来指定编译后的XML文件的位置了。
classpath表示定位到target目录下的classes目录,从这个目录下找寻mapper包下的所有XML后缀的文件,这就可以正常执行了。
最后
以上就是天真音响为你收集整理的SpringBoot中有关XML文件的编译问题一、问题描述二、名词解释三、三者的区别的全部内容,希望文章能够帮你解决SpringBoot中有关XML文件的编译问题一、问题描述二、名词解释三、三者的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复