当前位置: 代码迷 >> 综合 >> Spring Boot 系列(二)Spring Data JPA的使用
  详细解决方案

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

热度:27   发布时间:2023-10-23 16:49:41.0

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=aabbcc@163.com 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...

  相关解决方案