首页 > 数据库 >使用 @NoRepositoryBean 简化数据库访问

使用 @NoRepositoryBean 简化数据库访问

时间:2024-04-27 18:22:36浏览次数:28  
标签:存储 NoRepositoryBean Spring 数据库 private 简化 接口 public

在 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,Spring,数据库,private,简化,接口,public
From: https://www.cnblogs.com/didispace/p/18162337

相关文章

  • 数据库中间件-He3Proxy
    什么是数据库中间件?随着互联网行业的蓬勃发展,业务访问量、数据量激增,传统数据库的单库、大表已成为业务发展的瓶颈,进而衍生出数据库主从实例、分库分表等方案,为减少数据库层变动对业务开发带来的复杂性,一种连接应用与数据库桥梁的工具孕育而生,即数据库中间件,它可以简单读写分离、......
  • access数据库批量更新中无法使用replace,出现“表达式中 'replace' 函数未定义”的替代
    如果我们想要批量修改数据库table_name表中aa字段中数据,将“|bbbb”删除sql的批量更新中,通用语法是:UPDATEtable_nameSETaa=REPLACE(aa,'|bbbb','')但是,如果是access数据库,就可能出现以下的报错信息:MicrosoftJETDatabaseEngine错误'80040e14'表达式中'replace'函......
  • 陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密
    陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密  这种专利权人是公司,个人是发明人,专利年费是申请人先垫付,然后公司报销了,这个专利本身就不属于员工的这个是公司是专利权人, 使用权是公司,如果想要维持权利的话,需要缴纳年费,专利发明现在一个市......
  • 在数据库的查询与更新中,CHARINDEX与instr的区别?
    在数据库和字符串处理的领域中,CHARINDEX和INSTR是两个常用的函数,它们都用于查找子字符串在主字符串中的位置。尽管这两个函数在功能上有所重叠,但它们之间存在一些关键的区别,这些区别可能会影响开发者在选择使用哪一个函数时的决策。首先,CHARINDEX是SQLServer中的一个内置函数,它......
  • 数据库——一些复健(主要是约束和索引相关练习)
    重要的是练习,写作业时写的絮絮叨叨就忽略吧。  强化学习2                    【练习9.1】在stusys数据库中创建course1表,以列级完整性约束方式定义主键。  【练习9.2】在stusys数据库中创建course2表,以表级完整性约束方式定义主键。  ......
  • mysql 数据库时区问题
    当数据库时区设置为国际时区时jdbc-url中添加以下配置serverTimezone=GMT%2B0Java服务中设置东八区TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));使用mybatis红的mapper.xml<resultMapid="BaseResultMap"type="cn.xs.qxj.mtk.pojo.XpCallInfo"......
  • 实验三 数据库完整性
    第1关:定义s表完整性createtables(snochar(2)PRIMARYKEY,snamevarchar(10)notnull,statusint,cityvarchar(10)DEFAULT'天津');第2关:定义p表完整性usedemo;#代码开始#定义p表;pno主码,pname非空、color只能取红、蓝、绿createtablep(......
  • 二十三、数据库性能优化方案
    数据库的优化方案核心本质有三种:减少数据量、用空间换性能、选择合适的存储系统,这也对应了开篇讲解的慢的三个原因:数据总量、高负载、查找的时间复杂度。 一、减少数据量数据序列化存储、数据归档、中间表生成、分库分表。二、用空间换性能该类型的两个方案都是用来应对......
  • Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景
    当在SpringBoot应用程序中使用SpringDataJPA进行数据库操作时,配置Schema名称是一种常见的做法。然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生变化。比如:需要做数据隔离的SaaS应用。所以,这篇博文将帮助您解决了在SpringBoot应用程序中如何设置动态S......
  • 1、oracle数据库-导入导出
    Oracle数据库的导入导出主要有三种方式:使用pl、sql开发工具导入导出dmp文件方式:这是最常用的导入导出方式,生成的dmp文件是二进制的,可以跨平台操作,并且包含权限信息,也支持大字段数据,使用最广泛。在导出语法中,可以通过指定“full=y”和“ignore=y”参数来进行整个数据库的......