Spring Data JPA用法详解(附带实例)
JPA(Java Persistence API)是由 Sun 官方提出的 Java 持久化规范,并不是一套产品。它为 Java 开发人员提供一种对象/关联映射工具来管理 Java 应用中的关系数据。
JPA 的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate、TopLink、JDO 等 ORM 框架各自为营的局面。值得注意的是,JPA 是在充分吸收现有的 Hibernate、TopLink、JDO 等 ORM 框架的基础上发展而来的,具有易于使用、伸缩性强等优点。从目前开发社区的反应上来看,JPA 受到了极大的支持和赞扬,其中包括 Spring 与 EJB 3.0 的开发团队。
Spring Data JPA 是 Spring 基于 PRM 框架、JPA 规范基础上封装的一套 JPA 应用框架,底层使用 Hibernate 的 JPA 技术实现,可使开发者用极简的代码实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展。
Spring Data JPA 让我们从 dao 层的操作中解放出来,基本上所有的 CRUD 都可以依赖它来实现,如下图所示:
JPA 的完整调用过程如下图所示:
由于部分 jar 包的版本已经在 Spring Boot 的 pom 依赖中的 parent 指定了,因此上述 JPA 的依赖不用显式指定,如下代码所示:
1) pom.xml 中的相关依赖:
2) application.properties(核心代码):
spring.jpa.properties.hibernate.hbm2ddl.auto 的相关配置如下:
User 实体代码如下所示:
dao 层代码如下所示:
ServiceImpl 层代码如下所示:
Controller 层代码如下:
JPA 的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate、TopLink、JDO 等 ORM 框架各自为营的局面。值得注意的是,JPA 是在充分吸收现有的 Hibernate、TopLink、JDO 等 ORM 框架的基础上发展而来的,具有易于使用、伸缩性强等优点。从目前开发社区的反应上来看,JPA 受到了极大的支持和赞扬,其中包括 Spring 与 EJB 3.0 的开发团队。
Spring Data JPA 是 Spring 基于 PRM 框架、JPA 规范基础上封装的一套 JPA 应用框架,底层使用 Hibernate 的 JPA 技术实现,可使开发者用极简的代码实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展。
Spring Data JPA 让我们从 dao 层的操作中解放出来,基本上所有的 CRUD 都可以依赖它来实现,如下图所示:


JPA实战
Spring Data JPA 的基本配置如下,pom.xml 中的相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
由于部分 jar 包的版本已经在 Spring Boot 的 pom 依赖中的 parent 指定了,因此上述 JPA 的依赖不用显式指定,如下代码所示:
1) pom.xml 中的相关依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
2) application.properties(核心代码):
spring.datasource.url=jdbc:mysql://*:*/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true spring.datasource.username= spring.datasource.password= spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.show-sql=true
spring.jpa.properties.hibernate.hbm2ddl.auto 的相关配置如下:
- create:每次加载 Hibernate 时都会删除上一次生成的表(包括数据),然后重新生成新表,即使两次没有任何修改也会这样执行,适用于每次执行单测前清空数据库。
- create-drop:每次加载 Hibernate 时都会生成表,但当 SessionFactory 关闭时所生成的表将自动删除。
- update:常用的属性值,第一次加载 Hibernate 时创建数据表(前提是需要先有数据库),以后加载Hibernate时不会删除上一次生成的表,而是会根据实体更新,只新增字段,不会删除字段(即使实体中已经删除)。
- validate:每次加载 Hibernate 时都会验证数据表结构,只会和已经存在的数据表进行比较,根据model修改表结构,但不会创建新表。
- 不配置此项,表示禁用自动建表功能。
User 实体代码如下所示:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "phone")
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
dao 层代码如下所示:
public interface UserDao extends JpaRepository<User,Integer> {
}
ServiceImpl 层代码如下所示:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> findAll() {
return userDao.findAll();
}
@Override
public Optional<User> findById(Integer id) {
Optional<User> user = userDao.findById(id);
return user;
}
@Override
public void saveUser(User user) {
userDao.save(user);
}
@Override
public void delete(Integer id) {
User user = new User();
user.setId(id);
userDao.delete(user);
}
}
Controller 层代码如下:
/**
* 用于测试 spring-boot-starter-jdbc 的接口
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public List<User> listUser() {
return userService.findAll();
}
@GetMapping("/{id}")
public Optional<User> findById(@PathVariable("id") Integer id) {
return userService.findById(id);
}
@PostMapping("/add")
public String add(@RequestBody User user) {
userService.saveUser(user);
return "success!";
}
@DeleteMapping("/{id}")
public String delete(@PathVariable("id") Integer id) {
userService.delete(id);
return "success!";
}
}
ICP备案:
公安联网备案: