Spring Boot项目集成Spring Data JPA 

作者: 老韩 分类: Spring Data JPA 发布时间: 2024-04-09 01:01

添加POM

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

 

添加数据库配置信息

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1/demo?characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create

其中 spring.jpa.hibernate.ddl-auto 主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据entity类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据entity类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
none:jpa不操作数据库结构。

使用Spring Data JPA,我一般习惯开发阶段使用update,发布包中使用none, 试用entity类来进行表结构管理

{
      "name": "spring.jpa.hibernate.ddl-auto",
      "values": [
        {
          "value": "none",
          "description": "Disable DDL handling."
        },
        {
          "value": "validate",
          "description": "Validate the schema, make no changes to the database."
        },
        {
          "value": "update",
          "description": "Update the schema if necessary."
        },
        {
          "value": "create",
          "description": "Create the schema and destroy previous data."
        },
        {
          "value": "create-drop",
          "description": "Create and then destroy the schema at the end of the session."
        }
      ]
    }

基础的CRUD

创建一个entity,对应的表为 tb_user , 属性有id,username,password,age,其中id是主键,主键自增。

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;
@Data
@Entity
@Table(name = "tb_user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String username;
    private String password;
    private int age;
}

 

增加上面的User类后,就可以尝试启动了,启动后,会发现数据库中自动创建了一张表。

然后增加一个UserRepository,代码如下:

import cn.com.hanbinit.quickstart.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {

}

 

上面代码中继承的是JpaRepository , 这个算是Spring Data JPA的最终接口了,至于都有哪些可以继承,以及他们的区别,后面的文章再说

为了方便验证,再增加一个UserController类:

import cn.com.hanbinit.quickstart.configuration.CommonResponse;
import cn.com.hanbinit.quickstart.entity.User;
import cn.com.hanbinit.quickstart.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/list")
    public CommonResponse<List<User>> list(){
        List<User> userList = userRepository.findAll();
        return new CommonResponse<>(userList);
    }

    @PostMapping("/add")
    public CommonResponse<User> add(@RequestBody User user){
        User savedUser = userRepository.save(user);
        return new CommonResponse<>(savedUser);
    }
}

 

验证

最后,启动工程,打开swagger验证。
首先,增加数据,增加数据的时候,为什么请求参数里面没有id,传id和不传id的区别,也会在后面的文章中介绍到。

增加了两条记录后,再调用/list接口获取数据。

总结

本文记录了在一个Spring Boot工程中引入Spring Data JPA后的最基础用法,更详细的介绍可以持续关注。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据