zoukankan      html  css  js  c++  java
  • spring data学习

    在Spring Data模块中定义依赖:

    <dependencies>
      <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
      </dependency>
    <dependencies>

    春D(Spring Data)帮我们封装了基本的增删改查,而且还提供很多便利的查询方法,继续看吧!

    春D提供的最重要的接口是Repository,CrudRepository实现这接口,先看看CrudRepository这鬼东西:

    //T表示实体类,ID则是实体中id的类型
    public interface CrudRepository<T, ID extends Serializable>
        extends Repository<T, ID> {
    
        <S extends T> S save(S var1);
    
        <S extends T> Iterable<S> save(Iterable<S> var1);
    
        T findOne(ID var1);
    
        boolean exists(ID var1);
    
        Iterable<T> findAll();
    
        Iterable<T> findAll(Iterable<ID> var1);
    
        long count();
    
        void delete(ID var1);
    
        void delete(T var1);
    
        void delete(Iterable<? extends T> var1);
    
        void deleteAll();
    }

    CrudRepository如其名,封装了基本的增删改查接口

    再看看PagingAndSortingRepository,他是CrudRepository的儿子,具体源码如下:

    public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
        Iterable<T> findAll(Sort var1);
    
        Page<T> findAll(Pageable var1);
    }

    eg:访问第二页,每页20条数据,可以这样:

    PagingAndSortingRepository<User, Long> repository = // … get access to a bean
    Page<User> users = repository.findAll(new PageRequest(1, 20));

    另外对于查询方法,删除和级数查询可以用如下的:

    eg:
    
    public interface UserRepository extends CrudRepository<User, Long> {
        //查询lastname为某某的数量
        Long countByLastname(String lastname);
    }
    eg:
    
    public interface UserRepository extends CrudRepository<User, Long> {
      //删除lastname为某某的记录
      Long deleteByLastname(String lastname);
      //删除lastname为某某的记录,返回删除的所有记录
      List<User> removeByLastname(String lastname);
    
    }

    定义自己的repository,需要下面4个步骤:

    1.声明自己的一个接口,继承Repository 或者其他一个继承Repository的子类:

    interface PersonRepository extends Repository<Person, Long> { … }

    2.在接口上定义查询方法:

    interface PersonRepository extends Repository<Person, Long> {
      List<Person> findByLastname(String lastname);
    }

    3.设置spring去为这些自定义的Repository创建代理类:

    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    
    @EnableJpaRepositories
    class Config {}
    或者XML配置:
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/data/jpa
         http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
    
       <jpa:repositories base-package="com.acme.repositories"/>
    
    </beans>

    4.获得自定义的repository实例:

    public class SomeClient {
    
      @Autowired
      private PersonRepository repository;
    
      public void doSomething() {
        List<Person> persons = repository.findByLastname("Matthews");
      }
    }

    根据方法名创建查询:

    public interface PersonRepository extends Repository<User, Long> {
    //根据addres和lastname查询person列表
    List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
    
      //(增强唯一标示查询)Enables the distinct flag for the query
      List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
      List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
    
      //(查询lastname忽略大小写)Enabling ignoring case for an individual property
      List<Person> findByLastnameIgnoreCase(String lastname);
      //(查询属性都忽略大小写)Enabling ignoring case for all suitable properties
      List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
    
      //(排序,简单明了)Enabling static ORDER BY for a query
      List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
      List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
    }
    • 注意:
    • 除了可以用And 和Or 连接属性外,你还可以用Between, LessThan, GreaterThan, Like等

    带有分页和排序的查询:

    Page<User> findByLastname(String lastname, Pageable pageable);
    
    Slice<User> findByLastname(String lastname, Pageable pageable);
    //获得排序后的列表
    List<User> findByLastname(String lastname, Sort sort);
    //按照分页的条件获得列表
    List<User> findByLastname(String lastname, Pageable pageable);

    先看看Page的源码,可以知道,page可以获得总页数(totalPages)和总的元素个数:

    public interface Page<T> extends Slice<T> {
        int getTotalPages();
    
        long getTotalElements();
    
        <S> Page<S> map(Converter<? super T, ? extends S> var1);
    }

    再看看Slice的源码,可以知道,Slice是个Iterable迭代器,可以获得上一页,下一页,判断是否是第一个,最后一个等等。

    public interface Slice<T> extends Iterable<T> {
    int getNumber();
    
    int getSize();
    
    int getNumberOfElements();
    
    List<T> getContent();
    
    boolean hasContent();
    
    Sort getSort();
    
    boolean isFirst();
    
    boolean isLast();
    
    boolean hasNext();
    
    boolean hasPrevious();
    
    Pageable nextPageable();
    
    Pageable previousPageable();
    
    <S> Slice<S> map(Converter<? super T, ? extends S> var1);
  • 相关阅读:
    高可用OpenStack(Queen版)集群-6.Nova控制节点集群
    UML建模相关工具一览
    Java 常用资源工具集合
    [开发工具]Java开发常用的在线工具
    Beyond Compare 4解除到期限制的技巧
    [转]一个非常实用而且精妙的算法-并查集(java语言实现)
    Java实现比较两个List集合是否相等
    Java比较两个List集合的方法
    [转]Java & PHP RSA 互通密钥、签名、验签、加密、解密
    【LeetCode】192周赛-5428. 重新排列数组
  • 原文地址:https://www.cnblogs.com/clovejava/p/8262236.html
Copyright © 2011-2022 走看看