Spring Data JPA
JPA字面意思是JAVA持久层API,JPA定义了一系列标准,建立了实体类和数据库中表的一个映射关系,使得开发人员只需要操作实体类就能够起到操作数据库的效果,比如Hibernate就是一个实现了JPA
的一个持久层框架,而Spring Data JPA则再Hibernate的基础之上进行了进一步封装实现,开发人员只需遵循规范便可以轻易的操作数据库,极大提高了开发效率
环境搭建
- 通过DBeaver连接本地创建pg数据库test,创建若干表,插入模拟数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/4e04ae67ba0249a5939c20c44c296c41.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1cd979c3e79243e8a98b88dee340295c.png)
- 创建springboot项目,导入spring data jpa 核心依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
# 配置服务端口
server.port=8080
# 配置PG数据库连接信息
spring.datasource.url=jdbc:postgresql://localhost:5432/test
spring.datasource.username=postgres
spring.datasource.password=rainhey123456
spring.datasource.driver-class-name=org.postgresql.Driver
# 当服务首次启动会在数据库中生成相应表,后续启动服务时如果实体类有增加属性会在数据中添加相应字段,原来数据仍在
spring.jpa.hibernate.ddl-auto=update
# 执行数据库操作的时候会在控制台打印 sql 语句
spring.jpa.show-sql=true
- 创建对应数据库user表的实体类 User,Blog
package com.rainhey.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
//用来注解该类是一个实体类用来进行和数据库中的表建立关联关系,首次启动项目的时候,默认会在数据中生成一个同实体类相同名字的表
@Entity
// 该注解可以用来关联数据库中对应的表
@Table(name = "user",schema = "public")
public class User {
@Id //表明该属性字段对应数据库主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键生成策略,IDENTITY为主键自增策略
private Integer id;
private String username;
private String password;
private String address;
private Integer salary;
}
@Entity
@Table(name = "blog",schema = "public")
@Data
public class Blog {
@Id
@GeneratedValue
private Long id;
private String title;
private String content;
@Temporal(TemporalType.TIMESTAMP) // Temporal用来设置Date类型的属性映射到对应精度的字段
private Date updateTime;
}
基本CRUD
- 编写自己的接口 UserRepository 继承 JpaRepository,其中 JpaRepository 的第一个泛型类型对应其要操作的实体类的类型,第二个泛型类型对应要操作的实体类的主键类型
@Component
public interface UserRepository extends JpaRepository<User,Integer> {
}
@Test
public void insert(){
Blog blog = new Blog();
blog.setId(8L);
blog.setContent("hello");
blog.setTitle("this is title");
blog.setUpdateTime(new Date());
Blog save = blogRepository.save(blog);
System.out.println(save);
}
@Test
public void delete(){
blogRepository.deleteById(12L);
}
@Test
public void update(){
Blog blog = new Blog();
blog.setId(4L);
blog.setContent("test");
blog.setTitle("this is title");
blog.setUpdateTime(new Date());
Blog save = blogRepository.save(blog);
System.out.println(save);
}
@Test
public void find(){
List<Blog> all = blogRepository.findAll();
System.out.println(all);
}
分页,排序
public void userPage(Integer page,Integer size){
Sort sort= Sort.by(Sort.Direction.DESC,"salary");
Iterable<User> users = userPageRepository.findAll(sort);
System.out.println(users);
System.out.println("=================");
Pageable pageable= PageRequest.of(page, size, sort);
Page<User> all = userPageRepository.findAll(pageable);
List<User> content = all.getContent();
System.out.println(content);
}
基于规则自定义方法
Spring Data JPA允许开发者通过遵循一定的规则在接口内自己定义具有某种功能的方法,由Spring Data JPA根据方法名来推测开发者想要实现的功能,并进行自动实现,如以下自定义的方法
@Component
public interface UserRepository extends JpaRepository<User,Integer> {
List<User> findUserByAddress(String string);
List<User> findByAddressAndUsername(String address,String username);
List<User> findByAddressOrUsername(String address,String username);
List<User> findDistinctUserByAddress(String address);
List<User> findUserByAddressOrderBySalaryDesc(String address);
Page<User> findUserByAddress(String address,Pageable pageable);
List<User> findUserByaddress(String address, Sort sort);
List<User> findTop2ByAddressOrderBySalaryDesc(String address);
List<User> findByAddressLike(String a);
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/9abe0e2378c04a629cc5e7e9d363a5ee.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/21b93a323ae8424198d4c3525437786a.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/3472e87f31c74ad5a812d49736bdcb2a.png)
基于Query注解方法
@Component
public interface UserRepository extends JpaRepository<User,Integer> {
@Query(value = "select u from User u where u.id = ?1")
List<User> finds(Integer id);
@Query(value = "SELECT * FROM user WHERE id=?1",nativeQuery = true)
List<User> find11(Integer id);
}
- @query注解详解,一般value、countQuery、nativeQuery三个的值用的较多
public @interface Query {
String value() default ""; // 指定JPQL的查询语句。(nativeQuery=true的时候,是原生的Sql语句)
String countQuery() default ""; // 指定count的JPQL语句,如果不指定将根据query自动生成。如果当nativeQuery=true的时候,指的是原生的Sql语句)
String countProjection() default "";
boolean nativeQuery() default false; // 默认是false,表示value里面是不是原生的sql语句
String name() default "";
String countName() default "";
}