在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑可能会变得乏味且容易出错。开发人员经常发现自己为常见查询和方法重复代码,从而导致维护挑战和代码冗余。幸运的是,Spring Data JPA 为这个问题提供了一个强大的解决方案:@NoRepositoryBean 注解。在本文中,我们将探讨 @NoRepositoryBean 如何允许我们在超级接口中定义通用查询和方法,然后可以由所有基本类型存储库继承,从而简化我们的代码库并促进代码重用。

问题场景

在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑通常会导致冗余代码和维护挑战。每个存储库接口可能需要类似的查询和方法,导致代码重复并降低可维护性。

理解@NoRepositoryBean

@NoRepositoryBean 注释充当 Spring Data JPA 中的标记接口。当应用于存储库接口时,它指示 Spring Data JPA 不要为该接口创建具体的存储库 bean。相反,它旨在用作其他存储库接口的超类,提供可继承的通用功能。

实体建模

在深入研究存储库之前,让我们定义图书馆管理系统的实体模型:

@Entity
public class Library {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Other attributes of the library entity
@OneToMany(mappedBy = "library")
private List<LibraryItem> items;
// Getters and setters
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class LibraryItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Common attributes for all types of library items
@ManyToOne
@JoinColumn(name = "library_id")
private Library library;
@ManyToMany
@JoinTable(
name = "libraryitem_author",
joinColumns = @JoinColumn(name = "libraryitem_id"),
inverseJoinColumns = @JoinColumn(name = "author_id"))
private List<Author> authors;
// Getters and setters
}
@Entity
public class Book extends LibraryItem {
// Additional attributes specific to books
// Getters and setters
}
@Entity
public class ElectronicBook extends LibraryItem {
// Additional attributes specific to electronic books
// Getters and setters
}
@Entity
public class Magazine extends LibraryItem {
// Additional attributes specific to magazines
// Getters and setters
}
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Other attributes of the author entity
@ManyToMany(mappedBy = "authors")
private List<LibraryItem> libraryItems;
// Getters and setters
}

创建通用查询

现在我们已经定义了实体模型,让我们实现一个通用查询来根据图书馆 ID 检索图书馆项目。我们将通过创建一个用 @NoRepositoryBean 注释的基本存储库接口来实现这一点:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.Query;
import java.util.List; @NoRepositoryBean
public interface BaseLibraryItemRepository<T extends LibraryItem> extends JpaRepository<T, Long> {
@Query("SELECT t FROM #{#entityName} t WHERE t.library.id = :libraryId")
List<T> findAllByLibraryId(@Param("libraryId") Long libraryId);
}

在本例中,BaseLibraryItemlRepository定义了一个公共查询方法findAllByLibraryId,它根据图书馆ID检索图书馆项目。 SpEL 表达式 #{#entityName} 在运行时动态解析为与存储库关联的实体的名称。

继承通用功能

import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface BookRepository extends BaseLibraryItemRepository<Book> {
// Additional book-specific methods can be defined here
}

类似地,ElectronicBookRepositoryMagazineRepository可以以相同的方式扩展BaseLibraryItemRepository

通过这种方法,我们有效地简化了 Spring Data JPA 应用程序中的数据库访问逻辑、减少了代码重复并提高了可维护性。

结论

总之,Spring Data JPA 中的 @NoRepositoryBean 注释为跨多个存储库接口管理数据库访问逻辑提供了强大的解决方案。通过在超级接口中定义通用功能,开发人员可以促进代码重用、减少冗余并增强应用程序的可维护性。这种方法在存储库共享相似查询和方法的场景中特别有用。通过实施此解决方案,开发人员可以简化其代码库并专注于实现特定于业务的逻辑,而无需承担重复的数据库访问代码的负担。我们创建了一个高质量的Spring技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

使用 @NoRepositoryBean 简化数据库访问的更多相关文章

  1. c++ 11 是如何简化你的数据库访问接口的

    之前写过一篇文章专门分析了 c++ 模板编译过程中报的一个错误:<fatal error C1045: 编译器限制 : 链接规范嵌套太深 >,其中涉及到了 qtl -- 一个使用 c++ ...

  2. [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)

    [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date  周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...

  3. 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

    在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...

  4. 三种数据库访问——Spring JDBC

    本篇随笔是上两篇的延续:三种数据库访问——原生JDBC:数据库连接池:Druid Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要 ...

  5. 数据库访问工具 DBUtl(公孙二狗)

    数据库访问工具 DBUtil DBUtil 用于简化数据库的访问,只要准备好配置文件,调用 DBUtil 的静态函数就能直接得到查询数据库的结果. 本文主要内容有: 数据库访问的思考 DBUtil 实 ...

  6. c# 窗体开发4 数据库访问技术

    ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...

  7. 数据库访问接口(ODBC,OLEDB,ADO)

    数据库访问接口发展历史 ODBC历史 ODBC(Open Database Connectivity,开放数据库互连).要了解ODBC是什么,先了解一下数据库连接的相关知识.在最开始连接数据库时,由于 ...

  8. 学习实践:使用模式,原则实现一个C++数据库访问类

    一.概述 在我参与的多个项目中,大家使用libMySQL操作MySQL数据库,而且是源码即复用,在多个项目中有多套相同或相似的源码,这样的复用方式给开发带来了不变,而且libMySQL的使用比较麻烦, ...

  9. 八:SpringBoot-集成JPA持久层框架,简化数据库操作

    SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...

  10. 基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中

    在我的各种开发框架中,数据访问有的基于微软企业库,有的基于EFCore的实体框架,两者各有其应用场景,不过多的去比较.最近在使用SqlSugar的时候,觉得这个数据访问处理的组件确实很灵活,据说性能也 ...

随机推荐

  1. 一文搞懂JavaEE的接口

    在Java EE(Java Enterprise Edition)开发环境中,编程意义上的"接口"(interface)和API接口虽然都涉及接口的概念,但它们属于不同层面的术语. ...

  2. springboot整合视频点播

    1 //上传视频到阿里云 2 @Override 3 public String uploadAyl(MultipartFile file) { 4 try { 5 //accessKeyId,acc ...

  3. NET Core使用Grpc通信(一):一元

    gRPC是一个现代的开源高性能远程过程调用(RPC)框架,它可以高效地连接数据中心内和跨数据中心的服务,支持负载平衡.跟踪.运行状况检查和身份验证. gRPC通过使用 Protocol Buffers ...

  4. Android将数据导入到已有的excel表格_0

    用到的jxl2.6.12 jar 包下载地址: https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl/2.6.12

  5. https安全性 带给im 消息加密的启发

    大家好,我是蓝胖子,在之前# MYSQL 是如何保证binlog 和redo log同时提交的?这篇文章里,我们可以从mysql的设计中学会如何让两个服务的调用逻辑达到最终一致性,这也是分布式事务实现 ...

  6. list集合中的实现类LinkedList

    LinkedList: 底层是一个双向链表,方便数据的频繁出入.便于快速插入,删除元素,不太方便进行查询 toArray(): 以正确的顺序(从第一个到最后一个素)返回一个包含此列表中所有元素的数组 ...

  7. JVM—运行时数据区

    JVM-运行时数据区 运行时数据区概述 JVM运行时数据区如下图: 整个JVM构成里面,主要由三部分组成:类加载系统.运行时数据区.执行引擎. 按照线程使用情况和职责分成两大类: 线程独享(程序执行区 ...

  8. 3D Object Detection Essay Reading 2024.04.05

    EMIFF 论文:https://arxiv.org/abs/2303.10975 代码:https://github.com/Bosszhe/EMIFF ​ 本文提出了一种新的基于摄像机的三维检测框 ...

  9. #树上启发式合并,位运算#CF570D Tree Requests

    题目 给定一个以 \(1\) 为根的 \(n\) 个结点的树,每个点上有一个字母\((a-z)\),每个点的深度定义为该节点到 \(1\) 号结点路径上的点数. 每次询问 \(a, b\) 查询以 \ ...

  10. #构造#洛谷 6470 [COCI2008-2009#6]CUSKIJA

    题目 给定一个长度为 \(n\) 的序列 \(a\),请将其重新排序, 新序列中任意相邻两个数之和都不能被 \(3\) 整除. 分析 分类讨论,如果只有3的倍数多于1个无解 没有 \(3k+1\) 或 ...