信息发布→ 登录 注册 退出

SpringBoot整合Spring Data JPA的详细方法

发布时间:2026-01-11

点击量:
目录
  • 前言
  • 核心概念
  • 新建SpringBoot项目
    • 创建MySQL数据库
    • 创建实体类
    • 创建Repository
    • 创建处理器
    • 准备SQL文件
    • 编写配置文件
    • 最终效果
    • 启动SpringBoot项目
    • 查看数据库
    • 自动更新数据表结构
  • 测试JPA的增删改查
    • 测试查询所有
    • 测试保存数据
  • 测试更新数据
    • 测试删除数据

      前言

      Spring Data JPA 是更大的 Spring Data 家族的一部分,可以轻松实现基于 JPA 的存储库。该模块处理对基于 JPA 的数据访问层的增强支持。它使构建使用数据访问技术的 Spring 驱动的应用程序变得更加容易。

      SpringData:其实SpringData就是Spring提供了一个操作数据的框架。而SpringData JPA只是SpringData框架下的一个基于JPA标准操作数据的模块。
      SpringData JPA:基于JPA的标准数据进行操作。简化操作持久层的代码。只需要编写接口就可以。

      核心概念

      Spring Data 存储库抽象中的中央接口是Repository. 它需要域类来管理以及域类的 ID 类型作为类型参数。此接口主要用作标记接口,以捕获要使用的类型并帮助您发现扩展此接口的接口。CrudRepository接口为被管理的实体类提供了复杂的 CRUD 功能。

      新建SpringBoot项目

      使用IDEA中的初始化向导可以快速构建SpringBoot项目

      填写基本的GAV信息

      选择这些依赖(LombokSpring WebSpring Data JPAMySQL Driver)

      打开Pom文件确保这些依赖都在

       <!--jpa-->
      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
       <!--web-->
      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-web</artifactId>
      </dependency>
       <!--mysql-->
      <dependency>
      	<groupId>mysql</groupId>
      	<artifactId>mysql-connector-java</artifactId>
      	<scope>runtime</scope>
      </dependency>
       <!--lombok-->
      <dependency>
      	<groupId>org.projectlombok</groupId>
      	<artifactId>lombok</artifactId>
      	<optional>true</optional>
      </dependency>

      创建MySQL数据库

      创建user数据库

      create database user;

      创建实体类

      @AllArgsConstructor
      @NoArgsConstructor
      @Entity
      @Data
      @Table(name = "user")
      public class User {
      
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Integer id;
          private String name;
          private Integer age;
      }

      注解详情:

      • @Entity:表明是一个实体类
      • @Table:声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),目录(Catalog)和schema的名字。该注释不是必须的,如果没有则系统使用默认值(实体的短类名)。
      • @Id 声明此属性为主键。该属性值可以通过应该自身创建,但是Hibernate推荐通过Hibernate生成
      • @GeneratedValue 指定主键的生成策略
        • TABLE:使用表保存id值
        • IDENTITY:identitycolumn
        • SEQUENCR :sequence
        • AUTO:根据数据库的不同使用上面三个
      • @Column :声明该属性与数据库字段的映射关系。

      创建Repository

      创建UserRepository接口,继承JpaRepository接口。

      JpaRepository<User, Integer>,左边类型为操作的数据表对应的实体类User,右边类型为主键返回类型。

      @Repository
      public interface UserRepository extends JpaRepository<User,Integer> {
      
      }

      Spring Data JPA包含了一些内置的Repository,实现了一些常用的方法:findonefindallsave等。

      创建处理器

      在处理器中创建操作数据表CRUD的基本操作

      @RestController
      public class UserController {
      
          @Autowired
          UserRepository userRepository;
         @RequestMapping("/list")
          public List<User> findAll(){
             List<User> userList = userRepository.findAll();
             return userList;
         }
         @RequestMapping("/save")
         public String save(User user){
             userRepository.save(user);
             return "保存成功";
         @RequestMapping("/update")
         public String update(User user){
             return "更新成功";
         @RequestMapping("/delete")
         public String delete(Integer id){
             userRepository.deleteById(id);
             return "删除成功";
      }

      准备SQL文件

      schema.sql

      create table if not exists user(
          `id` int primary key auto_increment,
          `name` varchar(255) not null,
          `age` int not null
      );

      data.sql

      insert into user (name,age) values('张三',18);
      insert into user (name,age) values('李四',19);
      insert into user (name,age) values('王五',20);
      insert into user (name,age) values('李六',21);

      编写配置文件

      # 应用服务 WEB 访问端口
      server.port=8080
      # 数据库驱动:
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      # 数据源名称
      spring.datasource.name=defaultDataSource
      # 数据库连接地址
      spring.datasource.url=jdbc:mysql://localhost:3306/user
      # 数据库用户名&密码:
      spring.datasource.username=root
      spring.datasource.password=root
      #SQL 脚本编码
      spring.datasource.sql-script-encoding=utf-8
      #数据 (DML) 脚本资源引用
      spring.datasource.data=classpath:db/data.sql
      #如果在初始化数据库时发生错误,是否停止
      spring.datasource.continue-on-error=true
      #确定是否应使用可用的 DDL 和 DML 脚本执行 DataSource 初始化时应用的模式
      spring.datasource.initialization-mode=ALWAYS
      #--------JPA配置----------
      #要操作的目标数据库
      spring.jpa.database=mysql
      #更新或创建数据表结构
      spring.jpa.hibernate.ddl-auto=update
      #控制台显示SQL
      spring.jpa.show-sql=true
      #物理命名策略的完全限定名称
      spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      #日志级别严重性映射
      logging.level.com.hsqyz.springboot_jpa=debug

      最终效果

      启动SpringBoot项目

      运行项目后,可以看到控制台结果:
      控制台显示使用hibernate创建了该表。

      查看数据库

      数据表结构

      数据库中的结果

      数据初始化配置

      • spring.datasource.schema=classpath:db/schema.sql:进行该配置后,每次启动程序,程序都会运行resources/db/schema.sql文件,对数据库的结构进行操作。
      • spring.datasource.data=classpath:db/data.sql:进行该配置后,每次启动程序,程序都会运行resources/db/data.sql文件,对数据库的数据操作。

      该配置非常适合开发环境,数据库的结构构建sql放在resources/db/schema.sql,数据sql放在resources/db/data.sql中。这样每次运行程序我都可以得到一个新的数据库。这样就不需要我每次为了测试而修改数据中的内容了。

      不过Spring Data JPA会根据实体类自动创建对应的数据表,所以我没有设置spring.datasource.schema的属性值,只设置了spring.datasource.data用来初始化数据表中的数据。

      注意:classpath:的路径对应着项目的resources文件

      自动更新数据表结构

      给实体类新增一个属性gender(性别)

      然后重新运行项目

      Hibernate: alter table user add column gender integer

      控制台显示hibernate更改表user添加列gender类型为integer

      刷新数据库查看数据表

      表结构会根据实体类的变化而变化,前提是设置spring.jpa.hibernate.ddl-auto=update

      #更新或创建数据表结构
      spring.jpa.hibernate.ddl-auto=update

      查看数据表结构

      由于设置spring.datasource.initialization-mode=ALWAYS,属性值为ALWAYS代表始终初始化数据源,以及开启了spring.datasource.data=classpath:db/data.sql数据表数据初始化脚本,所以每次启动项目都会运行一遍数据表数据初始化脚本data.sql,导致之前4条数据再次被插入一遍。

      #数据 (DML) 脚本资源引用
      spring.datasource.data=classpath:db/data.sql
      #如果在初始化数据库时发生错误,是否停止
      spring.datasource.continue-on-error=true
      #确定是否应使用可用的 DDL 和 DML 脚本执行 DataSource 初始化时应用的模式
      spring.datasource.initialization-mode=ALWAYS

      测试JPA的增删改查

      由于Controller类使用的是@RestController,返回的都是json数据 建议在浏览器安装json插件方便浏览

      测试查询所有

      访问http://localhost:8080/list

      成功返回数据表中的全部数据

      测试保存数据

      访问http://localhost:8080/save?name=花伤情犹在&age=18&gender=1

      查看数据表

      测试更新数据

      访问http://localhost:8080/update?id=9&name=花伤情&age=20&gender=0

      查看数据表

      测试删除数据

      访问http://localhost:8080/delete?id=9

      查看数据表

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!