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文件夹进行放置, 方便管理)
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 与哪个接口对应-->
<mapper namespace="com.atguigu.mapper.UserMapper">
    <!--配置-->
    <!--id  接口对应的方法-->
    <!--parameterType 方法入参类别 [可简写]-->
    <!--useGeneratedKeys 可理解成是否有返回值-->
    <!--keyProperty 返回值(主键)类别为-->
    <!--注: 返回值不是指方法中返回的值,而是执行后自动在(添加/更新)对象里被赋值-->
    <!--#{?} 入参类别中的属性-->
    <!--Map<String,Object> selectMapById(Long id);-->
    <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文件中加入
<!--<build>就放在<project>的下一级-->
<build>
  <!--资源插件
      告诉maven把 src/main/java目录中的 指定扩展名的文件 拷贝到 target/classes目录中。
  -->
  <resources>
    <resource>
      <directory>src/main/java</directory><!--所在的目录-->
      <includes>
        <include>**/*.xml</include>
      </includes>
      <filtering>false</filtering>
    </resource>
  </resources>
</build>

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

  • 第二种:放在resourses文件夹(创建一个mapper文件夹进行放置, 方便管理)
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 与哪个接口对应-->
<mapper namespace="com.atguigu.mapper.UserMapper">
    <!--配置-->
    <!--id  接口对应的方法-->
    <!--parameterType 方法入参类别 [可简写]-->
    <!--useGeneratedKeys 可理解成是否有返回值-->
    <!--keyProperty 返回值(主键)类别为-->
    <!--注: 返回值不是指方法中返回的值,而是执行后自动在(添加/更新)对象里被赋值-->
    <!--#{?} 入参类别中的属性-->
    <!--Map<String,Object> selectMapById(Long id);-->
    <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的路径可以按照默认的。
    在这里插入图片描述

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注解。
  • 在UserMapper接口上加上@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中不需要额外设置扫描。
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
@Repository和@Mapper是用于数据接口层的注解。 @Repository是Spring的注解,用于声明一个Bean,它可以与@Mapper同时使用,也可以单独使用。如果单独使用@Repository,需要配合使用MapperScannerConfigurer或者@MapperScan注解来让Spring扫描并识别这个Bean。 @MapperMybatis的注解,用于标识数据接口类,让Mybatis能够找到对应的mapper并在编译时动态生成代理类,实现数据库查询功能。单独使用@Mapper可能会在编辑器中出现警告,但不影响程序运行。可以配合使用@Repository来消除警告,或者在编辑器中设置忽略这种警告。 这两个注解的使用方式类似,都是在数据接口类上添加注解,但是@Mapper属于Mybatis,与Spring无关,而@Repository是Spring的注解。 所以,@Repository和@Mapper注解都是用于数据接口层,但是@MapperMybatis的注解,@Repository是Spring的注解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [@Repository注解的作用和用法,以及和@Mapper的区别](https://blog.csdn.net/fengling_smile/article/details/129853866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [@Repository 与 @Mapper的区别](https://blog.csdn.net/m0_51527921/article/details/125446670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值