我是靠谱客的博主 天真音响,最近开发中收集的这篇文章主要介绍SpringBoot中有关XML文件的编译问题一、问题描述二、名词解释三、三者的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、问题描述

有时候,当我们使用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文件的编译问题一、问题描述二、名词解释三、三者的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部