详解 @MapperScan 注解和 @Mapper 注解

文章目录

  • 1. @Mapper 注解
    • 1.1 @Mapper 注解的定义和用途
    • 1.2 @Mapper 注解的使用示例
  • 2. @MapperScan 注解
    • 2.1 @MapperScan 注解的定义和用途
    • 2.2 @MapperScan 注解的使用示例
  • 3. @Mapper 注解与 @MapperScan 注解的区别
  • 4. 使用 @Mapper 和 @MapperScan 的注意事项
  • 5. @Mapper 和 @MapperScan 在实际项目中的应用案例

1. @Mapper 注解

1.1 @Mapper 注解的定义和用途

在MyBatis框架中,@Mapper是一个标记接口,用于标记一个接口作为映射器接口。映射器接口是MyBatis的核心概念之一,它将Java方法与SQL语句关联起来。每个映射器接口方法对应于一个SQL语句,该SQL语句在映射器XML文件或使用@Select, @Update, @Insert, @Delete等注解在接口方法中直接定义。

当你在接口上使用@Mapper注解,MyBatis会知道这个接口是一个映射器接口,并将它注册到MyBatis的配置中。然后,你可以从MyBatis的SqlSession中获取这个映射器接口的实例,并调用其方法来执行SQL语句。

1.2 @Mapper 注解的使用示例

以下是一个使用@Mapper注解的示例:

@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(int id);
}

在这个例子中,UserMapper是一个映射器接口,它有一个方法getUserById。这个方法对应于一个SQL语句,该SQL语句是通过@Select注解定义的。当你调用getUserById方法时,MyBatis会执行该SQL语句,并将结果映射为User对象。

要获取UserMapper的实例,你可以从SqlSession中获取:

SqlSession sqlSession = ... // 获取SqlSession实例
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);

在这个例子中,我们从SqlSession中获取了UserMapper的实例,并调用了其getUserById方法来获取id为1的用户。

2. @MapperScan 注解

2.1 @MapperScan 注解的定义和用途

@MapperScan 是 MyBatis-Spring 集成包提供的一个注解,用于自动扫描指定包下的所有映射器接口,并将它们注册到 Spring 上下文中。这样,你就可以像其他 Spring 组件一样,通过 @Autowired 注解来注入映射器接口。

使用 @MapperScan 可以避免手动为每个映射器接口创建一个映射器 bean。这在你有大量映射器接口时特别有用。

2.2 @MapperScan 注解的使用示例

以下是一个使用 @MapperScan 注解的示例:

@Configuration
@MapperScan("com.example.myapp.mapper")
public class AppConfig {
}

在这个例子中,AppConfig 是一个配置类,它使用了 @MapperScan 注解来扫描 “com.example.myapp.mapper” 包下的所有映射器接口。然后,你就可以在你的服务类中注入这些映射器接口:

@Service
public class UserService {private final UserMapper userMapper;@Autowiredpublic UserService(UserMapper userMapper) {this.userMapper = userMapper;}public User getUserById(int id) {return userMapper.getUserById(id);}
}

在这个例子中,UserService 是一个服务类,它有一个 UserMapper 字段,该字段通过构造函数注入。当你调用 getUserById 方法时,它会调用 UserMapper 的 getUserById 方法来获取用户。因为 UserMapper 已经通过 @MapperScan 注解注册到了 Spring 上下文中,所以你可以通过 @Autowired 注解来注入它。

3. @Mapper 注解与 @MapperScan 注解的区别

@Mapper 和 @MapperScan 是 MyBatis 和 MyBatis-Spring 提供的两个注解,它们都用于处理映射器接口,但它们的用途和工作方式有所不同。

  1. @Mapper: 这是 MyBatis 提供的注解,用于将一个接口标记为映射器接口。你需要在每个映射器接口上使用这个注解。然后,你可以通过 MyBatis 的 SqlSession 获取映射器接口的实例,并调用其方法来执行 SQL 语句。
    @Mapper 注解针对的是一个一个的类,相当于是一个一个 Mapper.xml 文件。而一个接口一个接口的使用 @Mapper,太麻烦了,于是 @MapperScan 就应用而生了。@MapperScan 配置一个或多个包路径,自动的扫描这些包路径下的类,自动的为它们生成代理类。

  2. @MapperScan: 这是 MyBatis-Spring 提供的注解,用于自动扫描指定包下的所有映射器接口,并将它们注册到 Spring 上下文中。这样,你就可以像其他 Spring 组件一样,通过 @Autowired 注解来注入映射器接口。你只需要在一个配置类上使用这个注解,而不是在每个映射器接口上使用。
    当使用了 @MapperScan 注解,将会生成 MapperFactoryBean, 如果没有标注 @MapperScan 也就是没有 MapperFactoryBean 的实例,就走 @Import 里面的配置,具体可以在 AutoConfiguredMapperScannerRegistrar 和 MybatisAutoConfiguration 类中查看源代码进行分析。
    由此可见,动态代理和 AOP 知识非常的重要,各种框架都在大量的使用。

4. 使用 @Mapper 和 @MapperScan 的注意事项

使用 @Mapper 和 @MapperScan 注解时,有几点需要注意:

  1. 不要混淆使用: @Mapper 是用于标记接口为 MyBatis 的映射器接口,而 @MapperScan 是用于告诉 Spring 去哪里寻找映射器接口。因此,你不应该在同一个接口上同时使用这两个注解。

  2. @MapperScan 的位置: @MapperScan 应该被放在一个配置类上,并且这个配置类应该能被 Spring 扫描到。通常,我们会将它放在主应用类或者一个特定的配置类或者主启动类上。

  3. 扫描的包名: 当你使用 @MapperScan 时,你需要提供一个或者多个包名,这些包应该包含你的映射器接口。如果你的映射器接口分散在多个包中,你需要确保你列出了所有的包名。

  4. 避免重复扫描: 如果你的映射器接口都在一个包(或者一个包的子包)下,你只需要在这个包上使用 @MapperScan。不需要在子包上再次使用 @MapperScan,否则会导致重复扫描。

  5. 注意线程安全: MyBatis 映射器接口的方法应该是线程安全的,因为 Spring 默认将映射器 bean 设置为单例,这意味着同一个映射器接口的实例可能会被多个线程同时使用。

5. @Mapper 和 @MapperScan 在实际项目中的应用案例

在实际的项目中,我们通常会在 MyBatis 的映射器接口上使用 @Mapper 注解,并在 Spring Boot 的主应用类或者一个特定的配置类上使用 @MapperScan 注解。下面是一个简单的示例:

首先,我们定义一个映射器接口,并使用 @Mapper 注解:

@Mapper
public interface UserMapper {User selectUser(int id);
}

然后,我们在 Spring Boot 的主应用类上使用 @MapperScan 注解,来自动扫描映射器接口:

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

在这个示例中,我们告诉 Spring Boot 在 “com.example.myapp.mapper” 包下扫描所有的映射器接口。然后,我们可以在服务类中通过 @Autowired 注解来注入 UserMapper:

@Service
public class UserService {private final UserMapper userMapper;@Autowiredpublic UserService(UserMapper userMapper) {this.userMapper = userMapper;}public User getUser(int id) {return userMapper.selectUser(id);}
}

这样,我们就可以在 UserService 中直接使用 UserMapper,无需手动获取其实例。这是使用 @Mapper 和 @MapperScan 注解的典型方式,可以大大简化我们的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我会什么开发技能

java我会什么? 一、并发编程 1、并发编程:jdk中的courren包只能够类实现(seamplore,CountDownLaunch,Pharse,CycliBarrier,CompletableFuture),AQS的原理,线…

mysql笔记1

查询是在mysql中耗时最多的,约束是非常消耗cpu性能,外国不承认阿里的代码规范,在页面小报错没关系,库1与库2相互不影响,mysql被orcle收购了,所以mysql也属于oracle,企业中不允许推倒重来utf8mb3更适合中文 …

基于FPGA设计基础知识

基于FPGA设计基础知识 数字电路(数电)知识模拟电路(模电)知识1. 放大器1.1. 晶体管放大器1.2. 运算放大器1.3. 管子放大器(真空管放大器)微处理器/单片机知识其他相关知识 基于FPGA的算法设计是一个跨学科的…

底软驱动 | U-boot移植点点滴滴

u-boot 移植要点 一般厂家直接提供 u-boot 源码,做查看、修改(增加新功能) 或 u-boot 版本升级这三大块的用处;后两种都需要对新板子做适配/移植。 如果没有提供 u-boot 源码,那么就从 u-boot 官方版本中找到一个最相近的板子配置进行移植&…

【QT】布局管理器

布局管理器 布局管理器1. 垂直布局2. 水平布局3. 网格布局4. 表单布局5. Spacer 布局管理器 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的;也就是每个控件所在的位置, 都需要计算坐标, 最终通过 setGeometry 或者 move ⽅式摆放过去。 …

Log4j的原理及应用详解(四)

本系列文章简介: 在软件开发的广阔领域中,日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程,还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂,对日志管理的需求也日…

深入理解C++ 中的可调⽤对象

C中的可调⽤对象总结 普通函数类成员函数类静态成员函数与类成员函数的区别 仿函数简单示例高级用法-状态保持优缺点优点缺点 函数指针获取函数地址声明并调用函数指针 lambda表达式语法定义捕获单个捕获符 std::function()协程 可调用对象用处⼴泛: ⽐如在使⽤⼀些…

排序-java(详解)

一,分类 主要的排序大致分为以下几类: 1,插入排序,又分为直接插入排序和希尔排序 2,选择排序,又分为选择排序和堆排序 3,交换排序,又分为冒泡排序和快速排序 4,归并…

【linux】服务器安装及卸载pycharm社区版教程

【linux】服务器安装及卸载pycharm社区版教程 【创作不易,求点赞关注收藏】 文章目录 【linux】服务器安装及卸载pycharm社区版教程1、到官网下载安装包2、通过终端wget下载安装包3、解压4、安装5、设置环境变量6、运行pycharm7、删除pycharm安装包、卸载pycharm …

从“卷模型”到“卷应用”:AI时代的价值重塑与个性化智能探索

🌈所属专栏:【其它】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…

使用独享代理IP安全性高不高?怎么辨别独享IP和共享IP?

在网络安全的多种工具和技术中,代理IP是常用的一种手段,尤其是在处理需要隐私保护和安全性的网络请求时。独享代理IP(专用代理)和共享代理IP是两种主要的代理类型,它们在安全性、性能和成本方面有着本质的区别。本文将…

【漏洞复现】华测监测预警系统2.2 UserEdit.aspx SQL注入

声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。 一、漏洞描述 华测监测预警系统2.2(HuaCe Monitoring and Early Warning System 2.2)是一款由华…

人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解。本文将给大家展示全连接神经网络与代码详解,包括全连接模型的设计、数学原理介绍,并从手写数字识别到猫狗识…

【第32章】MyBatis-Plus之代码生成器配置

文章目录 前言一、概述1.特点说明2.示例配置3. 数据库配置 (DataSourceConfig) 二、全局配置 (GlobalConfig)1.方法说明2.示例配置 三、包配置 (PackageConfig)1. 方法说明2. 示例配置 四、模板配置 (TemplateConfig)1. 方法说明2. 示例配置 五、注入配置 (InjectionConfig)1. …

使用 exe4j 转换 Java jar 程序为 Windows 平台可执行文件 (.exe)

使用 exe4j 转换 Java jar 程序为 Windows 平台可执行文件 (.exe) 介绍exe4j 特点:转换全过程(软件操作)1、注册2、选择模式3、配置应用4、选择执行的方式(我这里管这个叫呈现方式)5、选择 JAR …

Mybatis 学习之 数字字符串判断“失效”问题

目录 1. 现象2. 原因3. 解决4. 特别注意 1. 现象 <?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"> <mapper…

Java 中的正则表达式

转义字符由反斜杠\x组成&#xff0c;用于实现特殊功能当想取消这些特殊功能时可能在前面加上反斜杠\ 例如在Java中\也具有特殊意义&#xff0c;前面加一个反斜杠表示取消特殊意义&#xff0c;表示1个普通的反斜杠\&#xff0c;\\\\表示2个普通的反斜杠\\。其实就是要求Java中的…

Python那些优质可视化工具!

作者&#xff1a;Lty美丽人生 https://blog.csdn.net/weixin_44208569 本次分享10个适用于多个学科的Python数据可视化库&#xff0c;其中有名气很大的也有鲜为人知的&#xff01; 1、matplotlib 两个直方图 matplotlib 是Python可视化程序库的泰斗。经过十几年它任然是Pytho…

【前端速通系列|第二篇】Vue3前置知识

文章目录 1.前言2.包管理工具npm2.1下载node.js2.2配置 npm 镜像源2.3 npm 常用命令 3.Vite构建工具4.Vue3组件化5.Vue3运行原理 1.前言 本系列文章旨在帮助大家快速上手前端开发。 2.包管理工具npm npm 是 node.js中进行 包管理 的工具. 类似于Java中的Maven。 2.1下载nod…

Autoware 定位之基于ARTag的landmark定位(六)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…