mybatis-plus关于@Mapper、@Repository、@MapperScan、xml文件的相关问题

1. @Mapper和@MapperScan必须二选一

两个都不加, 启动报错
所以要么在每个mapper接口上打上@Mapper注解;
要么在配置类(或者启动类)上使用@MapperScan(“xxx.xxx.mapper”) , 其参数就是你的mapper接口所在的包名.(推荐使用这种方式, 每个接口都写@Mapper太麻烦了);

2. @Repository用不用无所谓

  • 如果不用, 使用@Autowire注入mapper接口时, 会出现以下爆红情况. 说什么Could not autowire. No beans of xxxxxxxx
  • 但是其实并不会影响运行, 如果强迫症看到爆红就是不舒服, 可以在每个mapper接口上打上注解 @Repository.
  • @Repository注解是Spring的注解,使用该注解和@Autowired注解,就不会出现爆红的情况了,原因很简单,因为@Repository注解是Spring的注解,把当前类注册成一个bean了。

3. mapper的xml文件放哪?

主要有两种放法

  • 第一种:放在mapper接口所在的文件夹(创建一个xml文件夹进行放置, 方便管理)
    mybatis-plus关于@Mapper、@Repository、@MapperScan、xml文件的相关问题_第1张图片

DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.atguigu.mapper.UserMapper">
    
    
    
    
    
    
    
    
    <select id="selectMapById" resultType="map">
        select id,name,age,email from user where id=#{id}
    select>
mapper>

注意,这时还要在配置一下

  1. 在application.properties中加入
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:/com/limi/mptest/mapper/xml/*.xml
  1. pom.xml文件中加入


  
  
    
      src/main/java
      
        **/*.xml
      
      false
    
  

为啥要在pom.xml中加入如上配置?
因为maven默认只把src/main/resources目录中的非java文件, 拷贝到编译后的文件夹target中, 只有在pom.xml加入上面的配置后, src/main/java文件夹中mapper的xml文件才会拷贝到target/classes内, 否则编译后运行的.class字节码使用不到xml文件。
mybatis-plus关于@Mapper、@Repository、@MapperScan、xml文件的相关问题_第2张图片
在application.properties中配置时, classpath:指的是那个文件夹?
这个classpath指的就是src/main/java编译后出现在target中的文件夹classes, 编译后的.class字节码就放里面了. 同时上面也说了, src/main/java中mapper的xml的文件不是也跟着拷贝过来了吗, 字节码运行要使用xml文件, 所以要告诉它xml文件在哪。

  • 第二种:放在resourses文件夹(创建一个mapper文件夹进行放置, 方便管理)
    mybatis-plus关于@Mapper、@Repository、@MapperScan、xml文件的相关问题_第3张图片

DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.atguigu.mapper.UserMapper">
    
    
    
    
    
    
    
    
    <select id="selectMapById" resultType="map">
        select id,name,age,email from user where id=#{id}
    select>
mapper>
  • pom.xml就不需要第一种那样配置了, 因为上面也说了maven是默认会把resources中的非java文件拷贝到编译后的文件夹target中的。
  • application.properties中的mybatis-plus.mapper-locations的路径可以按照默认的。
    mybatis-plus关于@Mapper、@Repository、@MapperScan、xml文件的相关问题_第4张图片

4. 结论

@Mapper 一定要有,否则 Mybatis 找不到 mapper。
@Repository 可有可无,可以消去依赖注入的报错信息。
@MapperScan 可以替代 @Mapper。
@Component 和 @Repository 效果都是一样的,只是为了声明为bean
1.@Mapper
@Mapper 是 Mybatis 的注解,和 Spring 没有关系,@Repository 是 Spring 的注解,用于声明一个 Bean。
在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解。
2.Repository
正如上面说的,@Repository 用于声明 dao 层的 bean,如果我们要真正地使用 @Repository 来进行开发,那是基于代码的开发,简单来说就是手写 JDBC。SpringBoot中与 @Mapper的工作重叠了,所以可有可无。
3.其他扫描手段
基于注解的开发也有其他手段帮助 Mybatis 找到 mapper,那就是 @MapperScan 注解,可以在启动类上添加该注解,自动扫描包路径下的所有接口。

@SpringBootApplication
@MapperScan("com.gzh.mapper")
public class Springboot01MybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springboot01MybatisApplication.class, args);
    }
}

使用这种方法,接口上不用添加任何注解。

5. 解释

  • UserMapper上不加@Mapper,启动类上添加@MapperScan("com.atguigu"),就可以将指定包下的所有的mapper接口所动态生成的代理类交给IOC容器管理。需要注意的是idea提示注入问题,实际上可以正常运行,要是不想idea提示可以在UserMapper上加上@Repository注解。
  • 在UserDao类上加上@Mapper表示被容器识别到,创建这个的代理类,这样就自动将代理类交给IOC容器管理。另外有了@Mapper就不需要@MapperScan("com.atguigu"),两者作用一样,@Mapper这并不是配置bean的含义,切勿混淆。
  • 容易混淆的是:我们一般需要配置为bean,然后扫描才能使用它。这里我们只进行了扫描而没有去配置bean。我们这里使用的是自动代理,扫描也是扫描哪一个需要创建代理类,并不是扫描bean,故不需要配置bean。
  • 说明:springboot设置了自动扫描的包,会扫描到@Mapper的类,创建这个的代理类,这样就自动将代理类交给IOC容器管理。
    如果不加@Mapper就需要在启动类上添加@MapperScan("com.atguigu")就可以将指定包下的所有的mapper接口所动态生成的代理类交给IOC容器管理。
  • @Repository那是基于代码的开发,简单来说就是手写 JDBC,在dao的impl中使用注入bean的方式,使用@Repository配置了bean在spring中需要设置扫描,在springboot中不需要额外设置扫描。

你可能感兴趣的:(SpringBoot,springboot,mybatis)