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!"; } }