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...