org.springframework.data.jpa.repository.JpaReposit接口
JpaReposit是SpringBoot Data JPA提供的非常强大的基础接口。
可以看出JpaRepository继承了接口PagingAndSortingRepository和QueryByExampleExecutor。而PagingAndSortingRepository又继承CrudRepository。因此,JpaRepository接口同时拥有了基本CRUD功能以及分页功能。
QueryByExampleExecutor又称QBE查询,全称 QueryByExample,即这个是基于数据实例来构建查询的接口 , 通过传入查询示例来生成查询的SQL的技术, 这里面的一个示例即指一个查询的限制条件。
public interface QueryByExampleExecutor<T> { /** * Returns a single entity matching the given {@link Example} or {@literal null} if none was found. * * @param example can be {@literal null}. * @return a single entity matching the given {@link Example} or {@literal null} if none was found. * @throws org.springframework.dao.IncorrectResultSizeDataAccessException if the Example yields more than one result. */ <S extends T> S findOne(Example<S> example); /** * Returns all entities matching the given {@link Example}. In case no match could be found an empty {@link Iterable} * is returned. * * @param example can be {@literal null}. * @return all entities matching the given {@link Example}. */ <S extends T> Iterable<S> findAll(Example<S> example); /** * Returns all entities matching the given {@link Example} applying the given {@link Sort}. In case no match could be * found an empty {@link Iterable} is returned. * * @param example can be {@literal null}. * @param sort the {@link Sort} specification to sort the results by, must not be {@literal null}. * @return all entities matching the given {@link Example}. * @since 1.10 */ <S extends T> Iterable<S> findAll(Example<S> example, Sort sort); /** * Returns a {@link Page} of entities matching the given {@link Example}. In case no match could be found, an empty * {@link Page} is returned. * * @param example can be {@literal null}. * @param pageable can be {@literal null}. * @return a {@link Page} of entities matching the given {@link Example}. */ <S extends T> Page<S> findAll(Example<S> example, Pageable pageable); /** * Returns the number of instances matching the given {@link Example}. * * @param example the {@link Example} to count instances for, can be {@literal null}. * @return the number of instances matching the {@link Example}. */ <S extends T> long count(Example<S> example); /** * Checks whether the data store contains elements that match the given {@link Example}. * * @param example the {@link Example} to use for the existence check, can be {@literal null}. * @return {@literal true} if the data store contains elements that match the given {@link Example}. */ <S extends T> boolean exists(Example<S> example); }
当我们需要定义自己的Repository接口的时候,我们可以直接继承JpaRepository,从而获得SpringBoot Data JPA为我们内置的多种基本数据操作方法
/* * Copyright 2008-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.data.jpa.repository; import java.io.Serializable; import java.util.List; import javax.persistence.EntityManager; 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; /** * JPA specific extension of {@link org.springframework.data.repository.Repository}. * * @author Oliver Gierke * @author Christoph Strobl * @author Mark Paluch */ @NoRepositoryBean public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { /* * (non-Javadoc) * @see org.springframework.data.repository.CrudRepository#findAll() */ List<T> findAll(); /* * (non-Javadoc) * @see org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort) */ List<T> findAll(Sort sort); /* * (non-Javadoc) * @see org.springframework.data.repository.CrudRepository#findAll(java.lang.Iterable) */ List<T> findAll(Iterable<ID> ids); /* * (non-Javadoc) * @see org.springframework.data.repository.CrudRepository#save(java.lang.Iterable) */ <S extends T> List<S> save(Iterable<S> entities); /** * Flushes all pending changes to the database. */ void flush(); /** * Saves an entity and flushes changes instantly. * * @param entity * @return the saved entity */ <S extends T> S saveAndFlush(S entity); /** * Deletes the given entities in a batch which means it will create a single {@link Query}. Assume that we will clear * the {@link javax.persistence.EntityManager} after the call. * * @param entities */ void deleteInBatch(Iterable<T> entities); /** * Deletes all entities in a batch call. */ void deleteAllInBatch(); /** * Returns a reference to the entity with the given identifier. * * @param id must not be {@literal null}. * @return a reference to the entity with the given identifier. * @see EntityManager#getReference(Class, Object) */ T getOne(ID id); /* (non-Javadoc) * @see org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example) */ @Override <S extends T> List<S> findAll(Example<S> example); /* (non-Javadoc) * @see org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example, org.springframework.data.domain.Sort) */ @Override <S extends T> List<S> findAll(Example<S> example, Sort sort); }
在这里,还有个注意事项,JpaRepository接口的方法是有一定扩展性的,只要方法命名符合一定规范,只要写出方法名就可使用:
如 findBy[FileldName](String fieldName)