基于springdata JPA的dao层接口实现

基于springdata JPA的dao层接口实现以及分页

1、【举例】

只需要继承 JpaRepository<实体类,主键类型>

package com.tmall.tmallspringboot.dao;

import com.tmall.tmallspringboot.pojo.Category;
import org.springframework.data.jpa.repository.JpaRepository;

public interface CategoryDao extends JpaRepository<Category,Integer> {
    //大部分crud方法都在JpaRepository及其父类中了,所以几乎不用自己定义
}

2、【源码】

一步步点进来,从这两个接口可以看到几乎提供了所有常用的方法。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.data.jpa.repository;

import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;

@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAllById(Iterable<ID> var1);

    <S extends T> List<S> saveAll(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.data.repository;

import java.util.Optional;

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}

3、【自定义与分页】

通常情况下我们的数据需要分页显示,而且要是需要的方法没有提供,则需要自己定义。

首先,分页其实jpa也帮我们做了:

我们需要做的就是:

  • 返回类型设置为Page4Navigator<实体类>

  • 将自定义参数封装进Pageable对象,然后在调用jpa的对应方法时把Pageable对象9行传入即可

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

public Page4Navigator<Category> list(int start, int size, int navigatePages) {
    Sort sort = new Sort(Sort.Direction.DESC, "id");
    Pageable pageable = PageRequest.of(start, size, sort);
    Page pageFromJPA = categoryDao.findAll(pageable);

    return new Page4Navigator<>(pageFromJPA, navigatePages);
}

自定义条件查询加分页则需要在上面的基础上,在dao层中添加一下:

import com.tmall.tmallspringboot.pojo.Category;
import com.tmall.tmallspringboot.pojo.Property;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PropertyDao extends JpaRepository<Property,Integer> {

  // 自定义条件查询
    Page<Property> findByCategory(Category category, Pageable pageable);
}

你可能感兴趣的:(JAVA后端学习)