What is `@Repository` does?

news2024/9/29 21:34:41

@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;

    @Autowired
    public 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 {

    @Autowired
    private 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等

    @Bean
    public 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 {

    @Autowired
    private OrderRepository orderRepository;
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public 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.coloradmin.cn/o/1386479.html

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

相关文章

KEIL MDK 工程(.uvprojx)目录更改后快速修改方法

概述 在项目过多时&#xff0c;为了方便管理&#xff0c; 需借用文件夹命名来&#xff0c;举例&#xff1a; 1、原工程是在“STM32_Test_Project\MDK-ARM”目录下&#xff0c;我现在创建新文件夹&#xff0c;“Test”&#xff0c;避免原来的受污染&#xff0c;或者好管理等等好…

Linux 多个php版本选择需要的php的版本(修改环境变量)

这两天遇到了个问题&#xff0c; 原本服务器的php版本是7.3.13&#xff0c;经过一些操作之后不知道怎么了变成了5.6 #php版本查看 php -v然后我就对 5.6版本进行了升级&#xff0c;升级到了7.3.33&#xff0c; 这个时候 php -v 是7.3.33&#xff0c; 神奇的一幕出现了&#xf…

鸿蒙开发之组合手势

当我们需要支持多个手势的时候&#xff0c;可以通过GestureGroup来实现&#xff0c;如下实现了同时支持Tap和Pan手势 import Prompt from system.prompt Entry Component struct OfficialGestureGroupPage {State message: string Hello Worldbuild() {Column() {Column() {T…

STM32F103标准外设库——认识STM32(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

SSH远程访问与控制

目录 ssh优点 作用 SSH的 软件 公钥首次连接原理 ssh远程登录 shh命令 远程连接 直接连接先输入ssh IP 连接指定用户 在 /etc/ssh/sshd_config下面修改端口号 修改服务端配置文件 ​编辑 白名单&#xff0c;只能登录本机的mcb用户 SSH服务的最佳实践 openSSH 服…

Vue.js轻量级框架:快速搭建可扩展的管理系统

一、前言 在项目实战开发中&#xff0c;尤其是大平台系统的搭建&#xff0c;针对不同业务场景&#xff0c;需要为用户多次编写用于录入、修改、展示操作的相应表单页面。一旦表单需求过多&#xff0c;对于开发人员来说&#xff0c;算是一种重复开发&#xff0c;甚至是繁杂的工作…

NetCore部署微服务(三)

接上文&#xff0c;服务端部署完成之后&#xff0c;同样我们也需要修改一下客户端代码 Blocking Queries 1.1 服务发现 在客户端代码中使用Nuget安装consul包 修改配置文件&#xff0c;我们首先需要把consul的请求地址配置在配置文件中 修改control方法 using Consul; usin…

第七在线荣获百灵奖 Buylink Awards 2023零售圈年度卓越服务商品牌

1月11日&#xff0c;由零售圈主办、20零售连锁协会协办、30零售行业媒体支持的中国零售圈大会暨2024未来零售跨年盛典在西安落下帷幕&#xff0c;在这个零售行业盛典中&#xff0c;第七在线凭借其高精尖产品和卓越的服务质量成功入选&#xff0c;并荣获了“百灵奖 Buylink Awar…

旧路由重置新路由设置新路由设置教程|适用于PPPoE拨号

前言 前几天朋友说路由器想要重置&#xff0c;但不知道怎么弄。所以就想着只帮忙重置路由器的话&#xff0c;只能帮到一个人。但把整个过程写成图文&#xff0c;就可以帮助更多人。 本文章适合电脑小白&#xff0c;请注意每一步哦&#xff01; 注意事项 开始之前需要确认光猫…

深度学习环境常用命令(持续更新......)

深度学习涉及常用命令 在深度学习过程中常涉及的命令记录备查。 本文中涉及命令均在windows上&#xff0c;使用Anaconda管理环境的情况下。 显卡环境相关命令 1.pytorch下查看cuda版本&#xff0c;查看cudnn版本 import torch print(torch.version.cuda) print(torch.back…

Docker 如何安装 MySQL 并实现远程连接

Hello各位小伙伴们大家好&#xff01;我是咕噜铁蛋&#xff01;随着云计算和容器化技术的兴起&#xff0c;Docker 已经成为现代软件开发的核心工具之一。它提供了一种轻量级、可移植、自包含的部署方式&#xff0c;使得开发人员可以更加便捷地构建、测试和发布应用程序。而 MyS…

docker安装部署Elasticsearch(ES)以及相关配置

Elasticsearch简介 mysql用作持久化存储&#xff0c;ES用作检索 基本概念&#xff1a;index库>type表>document文档 index索引&#xff08;相当于MySQL的数据库&#xff09; 动词&#xff1a;相当于mysql的insert 名词&#xff1a;相当于mysql的db Type类型&#xff…

Rust-借用检查

Rust语言的核心特点是&#xff1a;在没有放弃对内存的直接控制力的情况下&#xff0c;实现了内存安全。 所谓对内存的直接控制能力&#xff0c;前文已经有所展示&#xff1a;可以自行决定内存布局&#xff0c;包括在栈上分配内存&#xff0c;还是在堆上分配内存&#xff1b;支…

【开发篇】三、并发下的OOM分析

文章目录 1、并发下的OOM分析2、Jmeter模拟并发 1、并发下的OOM分析 用户请求过来&#xff0c; 后端查询数据库后封装Vo对象返回给前端后&#xff0c;然后正常这个Vo就可以被GC清理掉了。 但并发时&#xff0c;如果数据处理时间很长&#xff0c;大量对象存于内存&#xff0c;或…

开源28181协议视频平台搭建流程

最近项目中用到流媒体平台&#xff0c;java平台负责信令部分&#xff0c;c平台负责流媒体处理&#xff0c;找了评分比较好的开源项目 https://gitee.com/pan648540858/wvp-GB28181-pro 流媒体服务基于 c写的 https://github.com/ZLMediaKit/ZLMediaKit 说明文档&#xff1a;h…

web前端(第二次作业)

1、计算用户指定的数值内的奇数和。例如用户输入的是 10&#xff0c;则计算 1 3 5 7 9 的和 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script>var nprompt("请输入数值&#xff1a;&…

基于信号完整性的一些PCB设计建议

最小化单根信号线质量的一些PCB设计建议 1. 使用受控阻抗线&#xff1b; 2. 理想情况下&#xff0c;所有信号都应该使用完整的电源或地平面作为其返回路径&#xff0c;关键信号则使用地平面作为返回路径&#xff1b; 3. 信号的返回参考面发生变化时&#xff0c;在尽可能接近…

抖店搬运同行产品截流后,还是不出单?优化主图和链接的方法如下

我是王路飞。 跟品、搬运同行店铺内的爆品上架到自己的店铺&#xff0c;公认是起店最快的方法。 因为有流量的产品&#xff0c;同行已经替你选出来了&#xff0c;你只需要上架去卖就可以了。 但很多新手采用跟品方法的时候&#xff0c;自己店铺还是没什么流量&#xff0c;也…

phpstorm配置ftp

1 选择设置ftp 2设置自动上传

MySQL运维篇(一)日志

一、错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&#xff0c;默…