七、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法

@NoRepositoryBean:Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口

1.通用接口:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

/**
 * 通用DAO接口
 *
 */
@NoRepositoryBean
public interface DAOInterface<T> extends JpaRepository<T, Long>, JpaSpecificationExecutor<T> {

}

2.添加自定义方法:

2.1自定义Repository接口

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable>
    extends PagingAndSortingRepository<T, ID> {

    boolean support(String modelType);

}
  • 添加BaseRepository接口
  • BaseRepository继承了PagingAndSortingRepository,这样可以保证所有Repository都有基本的增删改查以及分页等方法。
  • BaseRepository上添加@NoRepositoryBean标注,这样Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口
  • 添加support(String modelType)方法,表示该Repository的领域对象是否为modelType类型

2.2实现BaseRepository接口

public class BaseRepositoryImpl<T, ID extends Serializable>
    extends SimpleJpaRepository<T, ID>
    implements BaseRepository<T, ID> {

    private final Class<T> domainClass;

    public BaseRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {
        super(domainClass, entityManager);
        this.domainClass = domainClass;
    }

    @Override
    public boolean support(String modelType) {
        return domainClass.getName().equals(modelType);
    }

}

定义好自定义的方法后,我们现在通过一个基本的Repository类来实现该方法:

首先添加BaseRepositoryImpl类,继承SimpleJpaRepository类,使其拥有Jpa Repository的基本方法。

我们发现Repository有两个构造函数:

  • SimpleJpaRepository(JpaEntityInformation entityInformation, EntityManager entityManager)
  • SimpleJpaRepository(Class domainClass, EntityManager em)

这里我们实现第二个构造函数,拿到domainClassEntityManager两个对象。因为我们要实现的是知道某个Repository是否支持某个领域对象的类型,因此在实现构造函数时我们将domainClass的信息保留下来。

最后实现support方法,其参数是领域对象的类型,将其和domainClass对比,如果相等,则该Repository支持该类型的领域对象:

2.3创建自定义RepositoryFactoryBean

接下来我们来创建一个自定义的RepositoryFactoryBean来代替默认的RepositoryFactoryBeanRepositoryFactoryBean负责返回一个RepositoryFactory,Spring Data Jpa 将使用RepositoryFactory来创建Repository具体实现,这里我们用BaseRepositoryImpl代替SimpleJpaRepository作为Repository接口的实现。这样我们就能够达到为所有Repository添加自定义方法的目的。

public class BaseRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable>
    extends JpaRepositoryFactoryBean<R, T, I> {

    @Override
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) {
        return new MyRepositoryFactory(em);
    }

    private static class MyRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {

        private final EntityManager em;

        public MyRepositoryFactory(EntityManager em) {
            super(em);
            this.em = em;
        }

        @Override
        protected Object getTargetRepository(RepositoryMetadata metadata) {
            return new BaseRepositoryImpl<T, I>((Class<T>) metadata.getDomainType(), em);
        }

        @Override
        protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
            return BaseRepositoryImpl.class;
        }
    }
}

2.4配置Jpa factory class

最后,我们需要配置Jpa使用我们自定义的BaseRepositoryFactoryBean。Spring支持使用标注进行配置,我们在com.tmy.App中添加标注@EnableJpaRepositories(repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class)

@SpringBootApplication
@EnableJpaRepositories(repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class)
public class App {

    public static void main( String[] args ){
        SpringApplication.run(App.class, args);
    }
}

这样我们就为所有Repository添加了自定义的方法。

2.5测试

我们添加了一个TestController进行测试。进入根目录,执行mvn spring-boot:run可以运行我们的应用。

应用启动后,分别访问http://localhost:8080/test?type=blog&id=1http://localhost:8080/test?type=article&id=1,我们将看到article和blog两个不同的对象。

TestController中,我们通过依赖式注入获取到所有Repository的列表。当用户访问/test,系统将根据传进来的type遍历所有Repository,找到对应的Repository,再调用findOne(id)方法找到对应的对象。这样我们就不需要一个一个的去获取Repository实例,当领域对象越来越多时,通过这种方式是一种更加高效的对象管理方法。

@RestController
public class TestController {

    @Autowired
    private List<BaseRepository> repositories;

    @RequestMapping(value = "/test", method=RequestMethod.GET)
    public Object getEntry(@RequestParam(value="type", required = true) String type,
            @RequestParam(value="id", required=true) Integer id){
        if(type.equals("article")){
            type = Article.class.getName();
        }else if (type.equals("blog")) {
            type = Blog.class.getName();
        }
        for (BaseRepository baseRepository : repositories) {
            if(baseRepository.support(type)){
                return baseRepository.findOne(id);
            }
        }
        return null;
    }

}

参考:

  https://www.tianmaying.com/tutorial/spring-jpa-custom-all

原文地址:https://www.cnblogs.com/soul-wonder/p/9051649.html

时间: 2024-10-04 00:39:46

七、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法的相关文章

Spring Boot 整合Spring Data JPA

Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> &l

Spring Boot:整合Spring Data JPA

综合概述 JPA是Java Persistence API的简称,是一套Sun官方提出的Java持久化规范.其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术,它为Java开发人员提供了一种ORM工具来管理Java应用中的关系数据. 简而言之,JPA提供了使用面向对象的方式操作数据库的功能.JPA充分吸收了现有Hibernate,TopLink,JDO等ORM框架的优势,具有易于使用.伸缩性强等优点. Spring Data JPA是Spring基于Spring Data框架对于JPA

整合Spring Data JPA与Spring MVC: 分页和排序

之前我们学习了如何使用Jpa访问关系型数据库.比较完整Spring MVC和JPA教程请见Spring Data JPA实战入门,Spring MVC实战入门. 通过Jpa大大简化了我们对数据库的开发工作.但是,之前的例子中我们只提到了最简单的CRUD(增删改查)操作.实际上,Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学习如何通过Pageable来对数据库进行分页查询. 添加maven依赖 首先我们需要引入Jpa,数据库直接使用hsqldb内存数据库就可

Spring Boot 2.0.4整合Spring Data JPA和Druid,双数据源

最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hibernate为底层的Spring Data JPA复杂且性能一般. 但是当我们来到Spring Boot的世界后发现,相较于Spring Data JPA,MyBatis对Spring Boot的支持有限,Spring Data JPA与Spring Boot结合可以让dao变得非常简单,比如(1)

&lt;Spring Data JPA&gt;二 Spring Data Jpa

1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4

Spring Data JPA 提供的各种Repository接口作用

各种Repository接口继承关系: Repository : public interface UserRepository extends Repository<User, Integer> { } 方法命名规则查询方式: findByNameLike(String name) findByName(String name) findByNameAndAge(String name, Integer age) findByNameOrAddress(String name) ... 参考

spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)

最近上班太忙所以耽搁了给大家分享实战springboot 框架的使用. 下面是spring boot 整合多个框架的使用. 首先是准备工作要做好. 第一  导入框架所需的包,我们用的事maven 进行对包的管理. 以上的举例是本人的H5DS的真实的后台管理项目,这个项目正在盛情融资中,各位多多捧点人场.关注一下软件发展的动态,说不定以后就是您的生活不可或缺的软件哟. 点击打开链接.闲话少说.现在切入正题. 第二,写点配置文件 第三,spring data -设计一个简单的po关系,这里需要下载一

SpringBoot整合Spring Data Solr

此文不讲solr相关,只讲整合,内容清单如下 1. maven依赖坐标 2. application.properties配置 3. Java Config配置 1. maven坐标 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId></dependency> 2.

SpringBoot整合Spring Data Elasticsearch

Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射 elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多, 可以这样来对比elasticsearch和数据库 索引(indices)--------数据库(databases) 类型(type)------------数据表(table) 文档(Document)---------------- 行(ro