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后缀的文件,这就可以正常执行了。

  

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot项目,可以通过使用Querydsl来生成Q类。Querydsl是一种类型安全的查询框架,可以通过Q类来构建类型安全的查询语句。 下面是在Spring Boot项目生成Q类的步骤: 1. 添加Querydsl依赖 在pom.xml文件添加Querydsl依赖: ``` <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency> ``` 其,${querydsl.version}是Querydsl的版本号。 2. 配置插件 在pom.xml文件添加Querydsl插件: ``` <build> <plugins> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 其,输出目录为target/generated-sources/java,处理器为JPAAnnotationProcessor。 3. 编写实体类 在实体类添加注解@QueryEntity,表示此实体类需要生成Q类。 ``` @Entity @QueryEntity public class User { ... } ``` 4. 生成Q类 使用mvn命令生成Q类: ``` mvn clean compile ``` 在target/generated-sources/java目录下,可以看到生成的Q类。 5. 使用Q类进行查询 使用生成的Q类进行类型安全的查询,例如: ``` JPAQuery<User> query = new JPAQuery<>(entityManager); QUser qUser = QUser.user; List<User> users = query.from(qUser) .where(qUser.name.eq("Tom")) .fetch(); ``` 其,QUser是生成的Q类,可以进行类型安全的查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值