@Repository注解和@mapper的区别
1. @Repository 注解
-
通俗解释:
- 你可以把
@Repository注解想象成是一个专门负责管理数据库操作的 “仓库管理员”。这个管理员主要负责和数据库打交道,就像管理一个大仓库一样,他会进行各种操作,比如把货物(数据)存进仓库(数据库),从仓库里拿出货物,更新货物信息,或者把货物从仓库中删除。
- 你可以把
-
举例:
- 假设你在运营一个在线商城,需要存储和管理商品信息。你可以创建一个
ProductRepository类,并用@Repository注解标记它,如下所示:
- 假设你在运营一个在线商城,需要存储和管理商品信息。你可以创建一个
import org.springframework.stereotype.Repository;
import java.util.List;@Repository
public class ProductRepository {public List<Product> findAllProducts() {// 这里可以实现从数据库中查找所有商品的逻辑return null;}public void saveProduct(Product product) {// 这里可以实现将商品保存到数据库的逻辑}
}
- 在这个例子中,
ProductRepository类就像一个仓库管理员,它的findAllProducts()方法可以帮你找出仓库里的所有商品,而saveProduct(Product product)方法可以把新的商品放到仓库里。这个类主要负责数据的存储和检索操作,而且它是由 Spring 容器管理的,就像仓库管理员是由公司管理一样。
2. @Mapper 注解
-
通俗解释:
@Mapper注解通常用于 MyBatis 框架中,你可以把它看作是一个 “翻译官”。它的任务是将 Java 代码和 SQL 语句之间进行翻译,让 Java 代码能够和数据库进行通信。它会将你在 Java 接口中定义的方法 “翻译” 成相应的 SQL 语句,以便与数据库进行交互。
-
举例:
- 还是以在线商城为例,你有一个
ProductMapper接口,你可以这样写:
- 还是以在线商城为例,你有一个
import org.apache.ibatis.annotations.Mapper;
import java.util.List;@Mapper
public interface ProductMapper {List<Product> findAllProducts();void saveProduct(Product product);
}
- 在这里,
ProductMapper接口就像是一份翻译文件,你在接口中定义了findAllProducts()和saveProduct(Product product)等方法,MyBatis 框架会根据这些方法生成相应的 SQL 语句。例如,当你调用findAllProducts()方法时,MyBatis 会将其翻译成一条 SQL 语句,如SELECT * FROM products,然后执行这条 SQL 语句,从数据库中找出所有的商品。
3. 区别总结
-
职责范围:
-
@Repository:
- 它的职责更广泛,主要是从概念上表示一个数据存储库,通常用于传统的 Spring 数据访问对象(DAO),可能包含更复杂的数据操作逻辑,如处理事务、异常处理等。它更像是一个管理仓库的人员,除了基本的数据存储和检索,还可能处理一些其他的事情,比如检查仓库的状态、协调货物的运输等。
-
@Mapper:
- 主要侧重于接口和 SQL 语句的映射,它就像一个翻译官,只是把 Java 代码和 SQL 语句进行转换,让 Java 代码可以直接操作数据库。它的主要任务就是将接口方法翻译成 SQL 语句,以便对数据库进行操作。
-
-
使用场景:
-
@Repository:
- 当你使用 Spring 的
JPA或Hibernate等数据访问技术时,通常会使用@Repository注解。因为这些技术会帮你处理很多数据操作的细节,你可以在@Repository注解的类中使用它们提供的方法和功能,专注于业务逻辑和更复杂的数据操作。
- 当你使用 Spring 的
-
@Mapper:
- 当你使用 MyBatis 框架时,会使用
@Mapper注解。MyBatis 是一个轻量级的数据访问框架,你需要自己编写 SQL 语句,而@Mapper注解的接口会将你写的 Java 接口和 SQL 语句联系起来,让你能够通过接口方法操作数据库。
- 当你使用 MyBatis 框架时,会使用
-
4. 代码示例
- 假设你在一个 Spring Boot 应用中同时使用
@Repository和@Mapper:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class ProductService {// 使用 @Repository 注解的类@Autowiredprivate ProductRepository productRepository;// 使用 @Mapper 注解的接口@Autowiredprivate ProductMapper productMapper;public List<Product> getProductsFromRepository() {return productRepository.findAllProducts();}public List<Product> getProductsFromMapper() {return productMapper.findAllProducts();}
}
在这个 ProductService 类中,你可以看到 ProductRepository 和 ProductMapper 都被注入进来,并且可以使用它们的方法。但是它们的实现和背后的原理是不同的,ProductRepository 可能使用 JPA 或 Hibernate 等技术,而 ProductMapper 使用 MyBatis 框架将 Java 接口和 SQL 语句进行映射。
相关文章:
@Repository注解和@mapper的区别
1. Repository 注解 通俗解释: 你可以把 Repository 注解想象成是一个专门负责管理数据库操作的 “仓库管理员”。这个管理员主要负责和数据库打交道,就像管理一个大仓库一样,他会进行各种操作,比如把货物(数据&#x…...
解锁成长密码:探寻刻意练习之道
刻意练习,真有那么神? 在生活中,你是否有过这样的困惑:每天苦练英语口语,可一到交流时还是支支吾吾;埋头苦学吉他,却总是卡在几个和弦转换上;工作多年,业务能力却似乎陷入…...
cuda-cuDnn
cuda sudo /bin/sh cuda_11.7.0_515.43.04_linux.run cudnn cuDNN Archive | NVIDIA Developer Linux 系统 CUDA 多版本共存以及切换 – 颢天 安装cuda # 如果已经安装过驱动,驱动不需要再安装,取消勾选 安装cuDNN,cuda-cuDNN对应关系见…...
如何使用Python和PIL库生成带竖排文字的封面图像
在今天的博客中,我们将学习如何使用Python和PIL(Pillow)库生成一个简单而有创意的封面图像。我们将创建一个背景图像,并在其上绘制带有竖排文字的标题和副标题,最后再添加一些装饰性元素如星星和萤火虫。这个教程适合初…...
低代码开发 实战转型案例一览
数字浪潮澎湃,企业应用开发需求呈井喷之势。传统全栈开发虽底蕴深厚,然其漫长周期与高昂成本,难以追赶市场快速交付的急切步伐。无代码与低代码平台顺势崛起,宛如暗夜明灯,吸引非技术人员纷至沓来,投身应用…...
SQL Server中FIRST_VALUE和 LAST_VALUE窗口函数允许在一个指定的窗口内返回第一个或最后一个值
在 SQL Server 中,FIRST_VALUE 和 LAST_VALUE 是用于窗口函数(Window Functions)的两个非常有用的函数。它们允许你在一个指定的窗口内返回第一个或最后一个值。这两个函数通常与 OVER 子句一起使用,以定义窗口的范围和排序规则。…...
机器学习-高斯混合模型
文章目录 高斯混合模型对无标签的数据集:使用高斯混合模型进行聚类对有标签的数据集:使用高斯混合模型进行分类总结 高斯混合模型 对无标签的数据集:使用高斯混合模型进行聚类 对有标签的数据集:使用高斯混合模型进行分类 总结...
微信V3支付报错 平台证书及平台证书序列号
1.平台证书及平台证书序列号设置错误报错: 错误1: Verify the response’s data with: timestamp1735184656, noncea5806b8cabc923299f8db1a174f3a4d0, signatureFZ5FgD/jtt4J99GKssKWKA/0buBSOAbWcu6H52l2UqqaJKvrsNxvodB569ZFz5G3fbassOQcSh5BFq6hvE…...
41.欠采样技术下变频不能用与跨两个nyquist的情况下
当接收到的信号位于同一nyquist区间时,信号被成功的折叠到了第一Nyquist区间中。 当接收信号位于两个或多个采样区间时,最后多个区间的信号都会被折叠到第一Nyquist区间中造成信号的重叠。...
20241227通过配置nomodeset参数解决更新grub之后,ubuntu20.04.5无法启动的问题
20241227通过配置nomodeset参数解决更新grub之后,ubuntu20.04.5无法启动的问题 2024/12/27 17:34 0.397475]pci0000:00:07.0:DPC:RPPI0 l0gsize 0 is invalid dev/nvmeon1p9:clean,251849/4276224 files,3266309/17089792 blocks 缘起:公司电脑要安装加密…...
从 GitLab.com 到 JihuLab.com 的迁移指南
本文分享从 GitLab.com 到 JihuLab.com 的迁移指南。 近期,GitLab Inc. 针对其 SaaS 产品做了限制,如果被判定为国内用户,则会建议使用其在国内的发布版本极狐GitLab。从 GitLab SaaS 产品(GitLab.com)迁移到极狐GitL…...
深度学习中的并行策略概述:2 Data Parallelism
深度学习中的并行策略概述:2 Data Parallelism 数据并行(Data Parallelism)的核心在于将模型的数据处理过程并行化。具体来说,面对大规模数据批次时,将其拆分为较小的子批次,并在多个计算设备上同时进行处…...
Python大数据可视化:基于Python对B站热门视频的数据分析与研究_flask+hive+spider
开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 排行榜界面 系统管理界面 看板展示 摘要 本项目以对B站热…...
利用 Python 编写一个 VIP 音乐下载脚本
在这篇博客中,我们将介绍如何使用 Python 编写一个简单的 VIP 音乐下载脚本,利用网页爬虫技术从一个音乐网站下载歌曲。通过解析网页,获取歌曲的真实下载链接,并将音乐文件保存到本地。我们将使用 requests 和 BeautifulSoup 库来实现这个过程。 目标 本脚本的主要功能是…...
linux内核如何实现TCP的?
TCP(传输控制协议)是网络通信中的核心协议之一,实现了可靠的、面向连接的、基于字节流的通信。在Linux内核中,TCP的实现相对复杂,涉及多个模块和层次。以下是一些关键概念和机制: 1. 协议栈 Linux 内核中的网络协议栈(Network Stack)是分层设计的,包括链路层、网络层…...
【Spring】基于XML的Spring容器配置——FactoryBean的使用
随着Spring框架应用程序的复杂性增加,开发者需要更加灵活和强大的工具来创建和管理Bean。FactoryBean是Spring提供的一种强大机制,它允许开发者自定义Bean的创建过程。这种机制不仅提高了Bean的创建灵活性,还可以简化复杂对象的构建过程。 在…...
Docker使用——国内Docker的安装办法
文章目录 参考资料前言Mac安装办法Homebrew 安装1. 直接下报错2. 安装homebrew, 用国内镜像3. 安装Docker4. 启动docker服务5. 测试是否安装成功 参考资料 鸣谢大佬文章。 macOS系统中:Docker的安装:https://blog.csdn.net/sulia1234567890…...
电商会员门店消费数据分析
导包 import os import sqlite3 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from IPython.display import display_htmlpd.set_option(max_colwidth,200)%matplotlib inline前期准备 转义路径 # 获取Windows系统下的路…...
Vue.js 入门与进阶:打造高效的前端开发体验
Vue.js 是一款渐进式的 JavaScript 框架,凭借其轻量、易用、灵活的特点,已经成为了前端开发者的首选之一。从简单的交互到复杂的单页应用(SPA),Vue 为开发者提供了一套高效且易于上手的工具。在本文中,我们…...
Java包装类型的缓存
Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。 Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or Fal…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
