What is `@Repository` does?

@RepositorySpring注解,标识数据访问层组件(DAO, Data Access Object

在这里插入图片描述
当一个类被标记为 @Repository 时:
1、组件扫描与自动代理: Spring通过组件扫描(Component Scan)机制发现带有 @Repository 的类,并将其纳入Spring IoC容器管理,创建对应的Bean实例

2、异常处理增强: Spring会针对标记了 @Repository 的类捕获特定的数据访问异常(如JDBC相关的SQLException),并将其转换为Spring DataAccessException层次结构中的一个合适异常,简化异常处理。

3、事务管理: 在使用Spring AOP进行声明式事务管理的情况下,标记为 @Repository 的类的方法可以自动参与到事务中去,无需额外配置事务切面。

4、语义清晰: 尽管 @Repository 在功能上等同于 @Component@Service 注解,但是从语义上讲,它更明确地表明该类是用来执行数据库操作数据持久化工作的。

在这里插入图片描述

使用样例

基础DAO类

import org.springframework.stereotype.Repository;@Repository
public class UserRepository {// 假设这里有一个JdbcTemplate或EntityManager等数据访问工具对象private JdbcTemplate jdbcTemplate;@Autowiredpublic UserRepository(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public User findByUsername(String username) {// 使用jdbcTemplate执行SQL查询以根据用户名查找用户// ...}public void save(User user) {// 执行保存用户的SQL语句// ...}
}

结合Spring Data JPA

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends JpaRepository<User, Long> {User findByUsername(String username);
}

与MyBatis整合

import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepositoryMapper {@Select("SELECT * FROM users WHERE username = #{username}")User findByUsername(@Param("username") String username);
}

自定义实现并处理特定异常

import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;@Repository
public class CustomUserRepository {@Autowiredprivate SomeDataAccessObject dataAccessObject;public User getUserById(Long id) throws CustomNotFoundException {try {return dataAccessObject.getUser(id);} catch (DataAccessException ex) {throw new CustomNotFoundException("User not found", ex);}}
}

在组件扫描和事务管理中配合使用

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = {"com.example.repository"})
public class AppConfig {// 配置数据源、JdbcTemplate或SessionFactory等@Beanpublic PlatformTransactionManager transactionManager(EntityManagerFactory emf) {return new JpaTransactionManager(emf);}
}// 在应用中
@Repository
public class ProductRepository {// 这里的方法将在事务中执行public void updateProduct(Product product) {// 更新产品逻辑}
}

结合@Transactional注解实现事务管理

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;@Autowiredprivate UserRepository userRepository;@Transactionalpublic void placeOrder(Order order, User user) {// 保存订单order.setUser(user);orderRepository.save(order);// 更新用户购买记录user.getOrders().add(order);userRepository.save(user);}
}@Repository
public interface UserRepository extends JpaRepository<User, Long> { }@Repository
public interface OrderRepository extends JpaRepository<Order, Long> { }

使用Spring Data REST配合@Repository

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;@Repository
public interface ProductRepository extends CrudRepository<Product, Long> {// Spring Data JPA自动提供CRUD操作,无需编写SQL或查询方法List<Product> findByCategory(Category category);// 自定义查询方法@Query("SELECT p FROM Product p WHERE p.name LIKE %:name%")List<Product> findByNameLike(@Param("name") String name);
}

使用Spring Data R2DBC配合@Repository

import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;@Repository
public interface ProductRepository extends R2dbcRepository<Product, Long> {Flux<Product> findByCategory(String category);@Query("SELECT * FROM products WHERE name LIKE $1")Flux<Product> findByNameLike(String namePattern);
}

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

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

相关文章

编程语言的比较—c语言,c++与java,c#的比较

c语言是历史悠久的语言&#xff0c;不仅可以开发应用程序&#xff0c;还可以用来编写操作系统。如果对接近硬件的部分进行操作&#xff0c;c语言是不二之选。 c语言是c语言中增加面向对象功能的编程语言。通常情况下&#xff0c;c可以编译c语言编写的代码。c广泛应用于微型计算…

【AI绘画+本地部署】基于krita的AI绘画(含windows一键整合包)

comfyuikrita所有相关资源整合包(无需下载后面链接)百度网盘&#xff1a;https://pan.baidu.com/s/1iwNRpdTaD26YbzSDm6WLDA?pwdbur8 –来自百度网盘超级会员V4的分享 krita绘画软件官网地址 https://krita.org/en/download/krita-desktop/ krita-ai-diffusion 插件&#xff…

数据库:园林题库软件(《城市绿地系统规划》答题卷四)

《城市绿地系统规划》答题卷四 填空题 1、生产绿地是指为城市绿化提供苗木、花草、种子的苗圃、草圃等圃地&#xff0c;是为城市绿化服务的生产、科研实验绿地。 园林苗圃的规模按照其用地面积来划分&#xff0c;可分为大型苗圃、中型苗圃、小型苗圃三类。 2、防护绿地是出…

P1451 求细胞数量——深搜、广搜

求细胞数量 题目描述 一矩形阵列由数字 0 0 0 到 9 9 9 组成&#xff0c;数字 1 1 1 到 9 9 9 代表细胞&#xff0c;细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞&#xff0c;求给定矩形阵列的细胞个数。 输入格式 第一行两个整数代表矩阵大小 n n n 和…

计算机网络-ACL访问控制列表

上一篇介绍NAT时候就看到了ACL这个东西了&#xff0c;这个是什么意思&#xff1f;有什么作用呢&#xff1f; 一、ACL访问控制列表 访问控制列表 (ACL, Access Control List)是由一系列permit或deny语句组成的、有序规则的列表。ACL是一个匹配工具&#xff0c;能够对报文进行匹配…

鸿蒙原生应用/元服务实战-AGC团队账户

多人及内外结合去开发运营鸿蒙原生应用元服务时&#xff0c;需要用到团队账户&#xff0c;AGC提供了强大的团队角色与权限分工能力。 团队帐号是开发者联盟为实名开发者提供的多个成员帐号登录与权限管理服务。当前团队帐号支持成员参与应用市场&#xff08;付费推广、应用内付…

设备树(1)-设备树是什么?设备树基础概念及语法

1.简介 设备树&#xff1a;device tree DTS&#xff1a;设备树源码文件&#xff0c;采用树形结构描述板级信息&#xff0c;例如IIC、SPI等接口接了哪些设备 DTSI&#xff1a;设备树头文件&#xff0c;描述SOC级信息&#xff0c;例如几个CPU、主频多少、各个外设控制信息等 DTB…

vue列表飞入效果

效果 实现代码 <template><div><button click"add">添加</button><TransitionGroup name"list" tag"ul"><div class"list-item" v-for"item in items" :key"item.id">{{ i…

校园水电抄表系统

校园水电抄表系统是一种现代化的水电管理方式&#xff0c;它通过高科技手段实现对校园内水电使用情况的实时监测和数据化管理&#xff0c;从而提高水电资源的利用效率&#xff0c;降低管理成本&#xff0c;为构建绿色、环保、节约型校园奠定基础。 一、系统概述 校园水电抄表…

K8S---NetworkPolicy

一、简介 在操作系统中,服务器有出口流量和入口流量,可以为服务器设置网络策略,允许哪些ip可以访问本机器的哪些端口,设置本机器可以访问哪些其他机器;在K8S系统类似,pod如同服务器,可以设置哪些其他pod可以访问本pod的哪些端口,也可以设置本pod可以访问外部哪些pod的…

力扣 | 11. 盛最多水的容器

双指针解法–对撞指针 暴力解法public int maxArea1(int[] height) {int n height.length;int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int area Math.min(height[i], height[j]) * (j - i);ans Math.max(ans, area);}}return ans;}双指针解法…

vue动画(transition)

Vue动画&#xff08;transition&#xff09; 动画列表&#xff08;选择其中一个即可&#xff09; /* fade */ .fade-enter-active, .fade-leave-active {transition: opacity 0.28s; } ​ .fade-enter, .fade-leave-active {opacity: 0; } /* fade */ ​ /* fade-transform */…

ARP相关

ARP报文格式&#xff1a; 目的以太网地址&#xff0c;48bit&#xff0c;发送ARP请求时&#xff0c;目的以太网地址为广播MAC地址&#xff0c;即0xFF.FF.FF.FF.FF.FF。 源以太网地址&#xff0c;48bit。 帧类型&#xff0c;对于ARP请求或者应答&#xff0c;该字段的值都为0x08…

怎么剪切视频中的一部分?看完你就知道了

怎么剪切视频中的一部分&#xff1f;随着自媒体的兴起&#xff0c;越来越多的人开始关注视频编辑和后期制作。在众多自媒体平台上&#xff0c;我们经常可以看到一些精彩的短视频&#xff0c;而这些视频往往都是经过精心编辑和剪切的。那么&#xff0c;怎么剪切视频中的一部分呢…

刘阳,定格历史,守护中华文化!

2021年2月24日&#xff0c;#圆明园365张珍贵老照片#的话题凭3.7亿阅读量冲上热搜。这批时代跨越80年的老照片仿佛重启记忆的按钮&#xff0c;让人梦回“夏宫”&#xff1b;少有人知道&#xff0c;它们的拥有者&#xff0c;却是一位不折不扣的80后。 刘阳&#xff0c;土生土长北…

springboot多数据源支持自定义连接池

背景 springboot 多数据源网上的文章很多&#xff0c;但大多都是互相抄袭&#xff0c;虽然可以实现多数据源的效果&#xff0c;但都是使用的默认的连接池&#xff0c;如果盲目使用可能会导致自定义的连接池参数没生效从而引发数据库连接问题。下面是参考官方文档多数据源支持自…

制作一个Python聊天机器人

我们学习一下如何使用 ChatterBot 库在 Python 中创建聊天机器人&#xff0c;该库实现了各种机器学习算法来生成响应对话&#xff0c;还是挺不错的 什么是聊天机器人 聊天机器人也称为聊天机器人、机器人、人工代理等&#xff0c;基本上是由人工智能驱动的软件程序&#xff0…

情人节专属--HTML制作情人节告白爱心

💕效果展示 💕html展示 <!DOCTYPE html> <html lang="en" > <head>

基于springboot+vue的旅游网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Kotlin 类型别名

Kotlin 提供 给 已存在的类型 取 别名的功能&#xff0c;称为 类型别名&#xff08;Type Aliases&#xff09;。 语法&#xff1a; typealias <别名> <类型或函数>对 简化 长类名 和 泛型类型名 很有用&#xff0c;比如&#xff1a; typealias FileTable<K&…