Spring Boot – Spring Data JPA
Spring Data JPA 或 JPA 代表Java Persistence API,所以在研究它之前,我们必须了解ORM(对象关系映射) 。所以对象关系映射只是将任何Java对象直接持久化到数据库表中的过程。通常,被持久化的对象的名称成为表的名称,该对象中的每个字段都成为一列。设置好表设置后,每一行对应于应用程序中的一条记录。 Hibernate 是 ORM 的一个例子。简而言之,JPA 是接口,而 hibernate 是实现。
Java持久性 API 提供了一个规范,用于将数据从Java对象持久化、读取和管理到数据库中的关系表。 JPA 为开发遵循标准的接口指定了一组规则和指南。直截了当:JPA 只是实现 ORM 的指南,没有用于实现的底层代码。 Spring Data JPA 是 Spring 框架的一部分。 Spring 数据存储库抽象的目标是显着减少为各种持久性存储实现数据访问层所需的样板代码量。 Spring Data JPA 不是 JPA 提供者,它是一个库/框架,在我们的 JPA 提供者行 Hibernate 之上添加了一个额外的抽象层。
使用示例在 Spring Application 中配置 Spring Data JPA
要求:STS IDE、MySQL 工作台、 Java 8+
在 STS 中创建一个 spring boot 项目。给出项目名称并选择添加所需的依赖项(Spring JPA、MySQL 驱动程序、Spring web),显示在附加的pom.xml中。
XML
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.6.1
com.example
ex
0.0.1-SNAPSHOT
ex
Demo project for Spring Boot
11
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
Java
package com.example.demo.modal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
// @Entity annotation defines that a
// class can be mapped to a table
@Entity
public class Employee {
// @ID This annotation specifies
// the primary key of the entity.
@Id
// @GeneratedValue This annotation
// is used to specify the primary
// key generation strategy to use
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
private String city;
public Employee() {
super();
}
public Employee(String name, String city) {
super();
this.name = name;
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
Java
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.modal.Employee;
// @Repository is a Spring annotation that
// indicates that the decorated class is a repository.
@Repository
public interface EmployeeRepository extends JpaRepository{
ArrayList findAllEmployee();
}
Java
package com.example.demo.service;
import java.util.ArrayList;
import com.example.demo.modal.Employee;
public interface EmpService {
ArrayList findAllEmployee();
Employee findAllEmployeeByID(long id);
void addEmployee();
void deleteAllData();
}
Java
package com.example.demo.service;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.modal.Employee;
import com.example.demo.repository.EmployeeRepository;
// @Service marks a Java class that performs some service,
// such as executing business logic, performing
// calculations, and calling external APIs.
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
EmployeeRepository employeeRepository;
@Override
public ArrayList findAllEmployee() {
return (ArrayList) employeeRepository.findAll();
}
@Override
public Employee findAllEmployeeByID(long id) {
Optional opt = employeeRepository.findById(id);
if (opt.isPresent())
return opt.get();
else
return null;
}
@Override
public void addEmployee() {
ArrayList emp = new ArrayList();
emp.add(new Employee("Lucknow", "Shubham"));
emp.add(new Employee("Delhi", "Puneet"));
emp.add(new Employee("Pune", "Abhay"));
emp.add(new Employee("Noida", "Anurag"));
for (Employee employee : emp) {
employeeRepository.save(employee);
}
}
@Override
public void deleteAllData() {
employeeRepository.deleteAll();
}
}
Java
package com.example.demo.controller;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.modal.Employee;
import com.example.demo.service.EmpServiceImpl;
@RestController
public class EmpController {
@Autowired
EmpServiceImpl empServiceImpl;
@PostMapping("/")
public void add() {
empServiceImpl.addEmployee();
}
@GetMapping("/findall")
public ArrayList getAllEmployee() {
return empServiceImpl.findAllEmployee();
}
@GetMapping("/findbyid/{id}")
public Employee getEmployeeUsingId(@PathVariable long id) {
return empServiceImpl.findAllEmployeeByID(id);
}
@DeleteMapping("/delete")
public void delete() {
empServiceImpl.deleteAllData();
}
}
或者,您也可以在创建项目时添加这些依赖项。
application.properties 文件:
spring.datasource.url=jdbc:mysql://localhost:3306/emp
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update
项目结构:
模态层:
使用一些 JPA 注释创建一个简单的 POJO(普通旧Java类)。
- @Entity :这个注解定义了一个类可以映射到一个表
- @Id:此注解指定实体的主键。
- @GeneratedValue:该注解用于指定要使用的主键生成策略。即指示数据库自动为该字段生成一个值。如果默认情况下未指定策略,将使用 AUTO。
Java
package com.example.demo.modal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
// @Entity annotation defines that a
// class can be mapped to a table
@Entity
public class Employee {
// @ID This annotation specifies
// the primary key of the entity.
@Id
// @GeneratedValue This annotation
// is used to specify the primary
// key generation strategy to use
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
private String city;
public Employee() {
super();
}
public Employee(String name, String city) {
super();
this.name = name;
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
DAO(数据访问对象)层:
- @Repository: @Repository 注释是任何满足存储库角色或原型的类的标记(也称为数据访问对象或 DAO)。
- JpaRepository
JpaRepository 是存储库的特定于 JPA 的扩展。它包含 CrudRepository 和 PagingAndSortingRepository 的完整 API。因此它包含用于基本 CRUD 操作的 API 以及用于分页和排序的 API。在这里,我们为员工启用数据库操作。
Java
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.modal.Employee;
// @Repository is a Spring annotation that
// indicates that the decorated class is a repository.
@Repository
public interface EmployeeRepository extends JpaRepository{
ArrayList findAllEmployee();
}
服务层:
Java
package com.example.demo.service;
import java.util.ArrayList;
import com.example.demo.modal.Employee;
public interface EmpService {
ArrayList findAllEmployee();
Employee findAllEmployeeByID(long id);
void addEmployee();
void deleteAllData();
}
@Service:此注解与提供某些业务功能的类一起使用。当使用基于注释的配置和类路径扫描时,Spring 上下文将自动检测这些类。这里 JPA 存储库有许多预定义的通用方法来执行数据库操作,一些在下面的代码中使用。
Java
package com.example.demo.service;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.modal.Employee;
import com.example.demo.repository.EmployeeRepository;
// @Service marks a Java class that performs some service,
// such as executing business logic, performing
// calculations, and calling external APIs.
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
EmployeeRepository employeeRepository;
@Override
public ArrayList findAllEmployee() {
return (ArrayList) employeeRepository.findAll();
}
@Override
public Employee findAllEmployeeByID(long id) {
Optional opt = employeeRepository.findById(id);
if (opt.isPresent())
return opt.get();
else
return null;
}
@Override
public void addEmployee() {
ArrayList emp = new ArrayList();
emp.add(new Employee("Lucknow", "Shubham"));
emp.add(new Employee("Delhi", "Puneet"));
emp.add(new Employee("Pune", "Abhay"));
emp.add(new Employee("Noida", "Anurag"));
for (Employee employee : emp) {
employeeRepository.save(employee);
}
}
@Override
public void deleteAllData() {
employeeRepository.deleteAll();
}
}
控制器层:
- @RestController:这是一个 Spring 注解,用于以声明方式构建 REST API。 RestController 注解应用于一个类以将其标记为请求处理程序,Spring 将在运行时进行构建并提供 RESTful Web 服务。
- @Autowired:此注解可用于在 setter 方法上自动装配 bean,就像 @Required 注解、构造函数、属性或具有任意名称和/或多个参数的方法一样。
- @PostMapping:此注解将 HTTP POST 请求映射到特定的处理程序方法。它是一个组合注释,充当@RequestMapping(method = RequestMethod.POST) 的快捷方式
- @GetMapping:这个注解是@RequestMapping 注解的一个特殊版本,它充当@RequestMapping(method = RequestMethod.GET) 的快捷方式。 @Controller 注释类中的 @GetMapping 注释方法处理与给定 URI 表达式匹配的 HTTP GET 请求。
- @DeleteMapping:此注解将 HTTP DELETE 请求映射到特定的处理程序方法。它是一个组合注释,充当@RequestMapping(method = RequestMethod.DELETE) 的快捷方式
Java
package com.example.demo.controller;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.modal.Employee;
import com.example.demo.service.EmpServiceImpl;
@RestController
public class EmpController {
@Autowired
EmpServiceImpl empServiceImpl;
@PostMapping("/")
public void add() {
empServiceImpl.addEmployee();
}
@GetMapping("/findall")
public ArrayList getAllEmployee() {
return empServiceImpl.findAllEmployee();
}
@GetMapping("/findbyid/{id}")
public Employee getEmployeeUsingId(@PathVariable long id) {
return empServiceImpl.findAllEmployeeByID(id);
}
@DeleteMapping("/delete")
public void delete() {
empServiceImpl.deleteAllData();
}
}
在 postman 中使用 JPA 显示输出:
打开邮递员,一一点击列出的API。
保存员工数据
查找所有员工列表
通过 id 查找员工
删除所有员工