目录

  • Spring Data
  • Spring Data 特点
  • Spring Data接口
  • Spring Data与JPA
  • 在Spring Boot中使用JPA
  • 导入pom.xml
  • 编写一个实体类与数据库字段进行映射
  • 编写接口继承JpaRepository
  • 使用
  • JPA配置文件配置
  • 自定义JPA接口
  • JPA一对一查询
  • 外键方法
  • 配置主表实体类
  • 配置附表实体类
  • 关联表方法
  • 配置主表实体类
  • JPA一对多查询
  • 一端实体类配置
  • 多端实体类配置


Spring Data

Spring Data项目的目的是为了简化构建基于Spring框架应用的数据访问技术,包括非关系数据库、Map-Reduce框架、云数据服务等等;另外也包含对关系数据库的访问支持。

Spring Data 特点

Spring Data为我们提供使用统一的API来对数据访问层进行操作,这主要是Spring Data Commons来实现的。它让我们在使用关系型或者非关系型数据库访问时都基于Spring的统一标准,标准包含了CRUD、排序、分页等相关操作。

Spring Data接口

SpringData jpa 支持哪些数据库 spring data jpa 配置_JPA

Spring Data与JPA

  1. 编写接口继承JpaRepository既有CRUD以及分页等基本功能
  2. 在接口中只要声明符合规范的方法,就有拥有对应的功能,命名规范如下表(不完全)

Keyword

Sample

JPQL snippet

And

findByLastnameAndFirstname

… where x.lastname = ?1 and

Or

findByLastnameOrFirstname

… where x.lastname = ?1 or x.firstname = ?2

Is,Equals

findByFirstnameIs,findByFirstnameEquals

… where x.firstname = ?1

Between

findByStartDateBetween

… where x.startDate between ?1 and ?2

LessThan

findByAgeLessThan

… where x.age < ?1

LessThanEqual

findByAgeLessThanEqual

… where x.age ⇐ ?1

GreaterThan

findByAgeGreaterThan

… where x.age > ?1

GreaterThanEqual

findByAgeGreaterThanEqual

… where x.age >= ?1

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

IsNull

findByAgeIsNull

… where x.age is null

IsNotNull,NotNull

findByAge(Is)NotNull

… where x.age not null

Like

findByFirstnameLike

… where x.firstname like ?1

NotLike

findByFirstnameNotLike

… where x.firstname not like ?1

  1. @Query自定义SQL语句

在Spring Boot中使用JPA

导入pom.xml

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

编写一个实体类与数据库字段进行映射

  • @Entity 告诉JPA这是一个实体类
  • @Table 其中name属性指定表名,默认为实体类名的小写
  • @JsonIgnoreProperties 在使用Jackson进行json序列化时,遇到JPA往实体添加的属性hibernateLazyInitializer会报错,使用该注解忽略该属性
  • @Id 指定主键
  • @GeneratedValue 自增策略,用GenerationType.IDENTITY指定为自增主键
  • @Column 标注这是一个列,name指定列名,默认为属性名,length指定字符串长度,默认为255,还有更多相关属性不再赘述
@Entity
@Table(name = "student")
@JsonIgnoreProperties(value={"hibernateLazyInitializer"})
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer studentId;

    @Column(name = "student_name", length = 45)
    private String studentName;

    @Column(name = "gender")
    private Boolean gender;

    @Column(name = "department")
    private String department;

    @Column(name = "phone_number")
    private String phoneNumber;
    /**
     * Getter and Setter
     */
}

编写接口继承JpaRepository

第一个泛型为实体类,第二个泛型为实体对象的主键的类

public interface StudentRepository extends JpaRepository<Student, Integer> {
}

使用

Contorller类

@RestController
@RequestMapping("student")
public class StudentController {
    @Resource
    private StudentRepository repository;
    @GetMapping("/{id}")
    public Student getOne(@PathVariable("id") Integer id){
        return repository.findById(id).orElse(null);
    }

请求

http://localhost:8080/student/1

结果

{
  "studentId": 1,
  "studentName": "张三",
  "gender": true,
  "department": "医工",
  "phoneNumber": "114514"
}

JPA配置文件配置

  • spring.jpa.show-sql=true开启sql语句日志
  • spring.jpa.hibernate.ddl-auto=update每次启动检查数据库字段是否与实体类不一致,不一致则更新或创建数据表

自定义JPA接口

添加符合命名规范的方法名称

List<Student> findByStudentName(String studentName);

Controller

@GetMapping("byName")
public List<Student> selectByName(Student student){
    return repository.findByStudentName(student.getStudentName());
}

请求

{
  "studentName": "张三"
}

结果

[
  {
    "studentId": 1,
    "studentName": "张三",
    "gender": true,
    "department": "医工",
    "phoneNumber": "114514"
  }
]

观察自动生成的SQL语句

select student0_.student_id as student_1_0_, student0_.department as departme2_0_, student0_.gender as gender3_0_, student0_.phone_number as phone_nu4_0_, student0_.student_name as student_5_0_ from student student0_ where student0_.student_name=?

JPA一对一查询

外键方法

主表中有字段关联附表,例dorm_id

配置主表实体类

  • @OneToOne 标注一对一
  • @JoinColumn name主表的关联id,referencedColumnName为附表的id
@OneToOne
@JoinColumn(name = "dorm_id", referencedColumnName = "dorm_id")
private Dorm dorm;

配置附表实体类

没有额外配置,配置实体类和接口即可

关联表方法

student_dorm(student_id, dorm_id)

配置主表实体类

  • @JoinColumn joinColumns关联表中的主表id,inverseJoinColumns关联表中的附表id
@OneToOne
@JoinColumn(name = "student_dorm",
            joinColumns = @JoinColumn(name="student_id"),
            inverseJoinColumns = @JoinColumn(name = "dorm_id")))
private Dorm dorm;

JPA一对多查询

article 表(id,title,conten,author_id) author 表(id,name)

一端实体类配置

@OneToMany(mappedBy = "author")
private List<Article> articleList;//文章列表

多端实体类配置

@ManyToOne
@JoinColumn(name="author_id")//设置在article表中的关联字段
private Author author;//所属作者