Spring Boot 系列(二)Spring Data JPA的使用

JPA是什么?

JPA(Java Persistence API)是Sun官方提出的Java持久化规范。是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,它的出现主要是为了简化现有的持久化开发工作和整合ORM技术。

Spring Data JPA是什么?

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展,极大的提高了开发效率! 

默认方法

jpa默认生成了一些基本的CURD方法,我们来看看JpaRepository这个接口:

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

    List<T> findAll(Sort var1);

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

    <S extends T> List<S> save(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);
}

使用默认的方法

继承JpaRepository

public interface UserRepository extends JpaRepository<User, Long> {
}
userRepository.findAll();

直接使用就好了,功能看方法名就能看出来,这里就不详细介绍了。

save这个方法,如果没有主键的的话,默认是新增,有主键的话则是修改。

自定义简单查询

自定义简单查询就是根据方法名来自动生成sql,主要用法是findByXXX()、deleteByXXX()等,XXX为属性名称。

User findByUserName(String userName);

Long deleteById(Long id);

也可以使用关键字 And、Or、Like、IgnoreCase、OrderBy等等

User findByUserNameOrEmail(String userName, String email);

List<User> findByEmailLike(String email);

User findByUserNameIgnoreCase(String userName);

List<User> findByUserNameOrderByAgeDesc(int age);

分页查询

从上文我们可以看到JpaRepository这个接口继承了PagingAndSortingRepository接口

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

    Page<T> findAll(Pageable var1);
}

jpa已经实现了分页功能,只要传入Pageable参数

public interface Pageable {
    int getPageNumber();

    int getPageSize();

    int getOffset();

    Sort getSort();

    Pageable next();

    Pageable previousOrFirst();

    Pageable first();

    boolean hasPrevious();
}

spring封装了分页实现类,如下:

public class PageRequest extends AbstractPageRequest {
    private static final long serialVersionUID = -4541509938956089562L;
    private final Sort sort;

    public PageRequest(int page, int size) {
        this(page, size, (Sort)null);
    }

    public PageRequest(int page, int size, Direction direction, String... properties) {
        this(page, size, new Sort(direction, properties));
    }

    public PageRequest(int page, int size, Sort sort) {
        super(page, size);
        this.sort = sort;
    }

    public Sort getSort() {
        return this.sort;
    }

    public Pageable next() {
        return new PageRequest(this.getPageNumber() + 1, this.getPageSize(), this.getSort());
    }

    public PageRequest previous() {
        return this.getPageNumber() == 0 ? this : new PageRequest(this.getPageNumber() - 1, this.getPageSize(), this.getSort());
    }

    public Pageable first() {
        return new PageRequest(0, this.getPageSize(), this.getSort());
    }

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        } else if (!(obj instanceof PageRequest)) {
            return false;
        } else {
            PageRequest that = (PageRequest)obj;
            boolean sortEqual = this.sort == null ? that.sort == null : this.sort.equals(that.sort);
            return super.equals(that) && sortEqual;
        }
    }

    public int hashCode() {
        return 31 * super.hashCode() + (null == this.sort ? 0 : this.sort.hashCode());
    }

    public String toString() {
        return String.format("Page request [number: %d, size %d, sort: %s]", this.getPageNumber(), this.getPageSize(), this.sort == null ? null : this.sort.toString());
    }
}

使用时需要传的参数有:page页数、size每页的数据数量、sort排序规则(可选)

    int page=1,size=10;
    Sort sort = new Sort(Direction.DESC, "id");
    Pageable pageable = new PageRequest(page, size, sort);
    userRepository.findAll(pageable);

自定义SQL

@Query是用来配置自定义SQL的注解,后面参数nativeQuery = true表明了使用原生的sql,如果不配置,默认是false,则使用HQL查询方式

@Modifying注解,完成数据的删除、添加、更新操作

@Transactional,开启事务自动化管理

    @Modifying
    @Query(value = "insert into user(username,age) values(?1,?2)",nativeQuery = true)
    int addUser(String username,int age);

    @Transactional
    @Modifying
    @Query(value = "update user set [email protected] where username=?1",nativeQuery = true)
    int updateUserEmail(String username);

    @Modifying
    @Query(value = "delete from user where username=?1 and password=?2",nativeQuery = true)
    int deleteUser(String username,String password);


    @Query("select u from User where email = ?1")
    User findByEmail(String email);


    @Query(value = "select u from user u left join psndoc p where (?1 is null or u.username like ?1) and (?2 is null or p.name like ?2)")
    Page<User> findByUsernameAndPsndocName(String username, String name, Pageable pageable);


以上。

To be continued...

猜你喜欢

转载自blog.csdn.net/qq_34964197/article/details/81082468