首页 > 编程笔记 > Java笔记 阅读:1

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 的完整调用过程如下图所示:

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 的相关配置如下:
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!";
    }
}

相关文章