一、OverView

JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。

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

spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现

二、环境搭建

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>

application.properties

1
2
3
4
5
6
7
8
9
10
11
12
spring.datasource.url=jdbc:mysql://localhost:3306/jpa
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.database=mysql
# 是否在控制台打印 sql 语句
spring.jpa.show-sql=true
# 使用 InnoDB 作为引擎
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
# 每次启动都会更新数据库,如:增加字段等,但是对某个字段进行改造是识别不出来
spring.jpa.hibernate.ddl-auto=update

entiy

Student

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity
@Table(name = "student")
public class Student {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition = "INT UNSIGNED COMMENT '自增主键'")
private Long id;

@Column(name = "name", columnDefinition = "VARCHAR(50) NOT NULL COMMENT '用户名'")
private String name;

@Column(name = "pwd", columnDefinition = "VARCHAR(100) DEFAULT NULL COMMENT '密码'")
private String pwd;

// 省略 set get

}

Grade

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Entity
@Table(name = "grade")
public class Grade {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition = "INT UNSIGNED COMMENT '自增主键'")
private Long id;

@Column(name = "subject", columnDefinition = "VARCHAR(50) NOT NULL COMMENT '学科'")
private String subject;

@Column(name = "score", columnDefinition = "TINYINT UNSIGNED NOT NULL COMMENT '成绩'")
private String score;

// 省略 set get
}

注:这次使用两个表,为了后面进行复杂查询准备,这里的将两个表的自增 id 关联在一起,就不考虑多对多了

repository

StudentRepository

1
2
3
@Repository
public interface StudentRepository extends JpaRepository<Student, Long>, JpaSpecificationExecutor<Student> {
}

GradeRepository

1
2
3
@Repository
public interface GradeRepository extends JpaRepository<Grade, Long>, JpaSpecificationExecutor<Grade> {
}

在上次 aop 那里面就提过,由于继承的有 CRUD 的 repository 和一些其他的,这也是上面提到的解放 DAO 层的操作,具体的可以看下图

image-20200910145019869

三、CRUD

controller

GradeController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@RestController
@RequestMapping("/grade")
public class GradeController {

private GradeRepository gradeRepository;

@Autowired
public void setGradeRepository(GradeRepository gradeRepository) {
this.gradeRepository = gradeRepository;
}

@PutMapping("/add")
public Grade add(@RequestBody Grade grade) {
return gradeRepository.save(grade);
}

@GetMapping("/query")
public List<Grade> query() {
return gradeRepository.findAll();
}

@PostMapping("/update")
public Grade update(@RequestBody Grade grade) {
return gradeRepository.save(grade);
}

@DeleteMapping("/delete")
public void delete(@RequestParam Long id) {
gradeRepository.deleteById(id);
}
}

StudentController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@RestController
@RequestMapping("/student")
public class StudentController {

private StudentRepository studentRepository;

@Autowired
public void setStudentRepository(StudentRepository studentRepository) {
this.studentRepository = studentRepository;
}

@PutMapping("/add")
public Student add(@RequestBody Student student) {
return studentRepository.save(student);
}

@GetMapping("/query")
public List<Student> query() {
return studentRepository.findAll();
}

@PostMapping("/update")
public Student update(@RequestBody Student student) {
return studentRepository.save(student);
}

@DeleteMapping("/delete")
public void delete(@RequestParam Long id) {
studentRepository.deleteById(id);
}

}

注:

  • Spring 建议在这里的注入方式是 set 或者 构造注入,不要直接注解注入

  • 为了方便,在这里还是省略了 Service 层的操作

Postman测试

image-20200910150238245

image-20200910150312117

image-20200910150428435

image-20200910150520147

image-20200910150633346

image-20200910150751979

image-20200910150920385

image-20200910151023629

评论