SpringBoot整合JPA的增删改查教程

 更新时间:2026年03月01日 11:04:05   作者:安乐OvO.  
SpringJPA通过对象关系映射、仓库接口、查询生成和事务管理,简化了Java应用程序中的数据持久化操作,它自动实现数据访问,减少样板代码,降低复杂性,并与Spring框架无缝集成

Spring JPA 的核心思想是简化 Java 应用程序中的数据持久化操作。

以下是一些关键点:

核心概念

1.对象关系映射 (ORM)

Spring JPA 使用 ORM 技术,将 Java 对象和数据库表映射起来,使得开发人员可以操作对象而不必直接处理数据库表。

2.实体

实体代表数据库中的一条记录,每个实体类映射到数据库中的一张表。

3.仓库接口

提供了一组用于操作数据库的接口。

开发者通过继承这些接口,可以执行常见的数据操作,如创建、读取、更新和删除,而无需编写具体的 SQL 语句。

4.查询生成

Spring Data JPA 可以根据方法名称自动生成 SQL 查询,简化了查询的书写。

也支持使用 JPQL(Java Persistence Query Language)编写复杂查询。

5.事务管理

支持声明式事务管理,确保在执行数据库操作时的一致性和完整性。

优点

  • 简化开发:自动实现常见的数据访问操作,减少了样板代码的编写。
  • 降低复杂性:减少了直接操作 SQL 的需要,允许开发者更专注于业务逻辑。
  • 集成 与 Spring 框架其他部分(如事务管理、Spring Boot)无缝集成,提升开发效率。

配置和使用

  • 自动配置:如果使用 Spring Boot,许多配置可以自动完成,只需提供基本的数据库连接信息。
  • 声明式查询:使用方法命名规则,Spring Data JPA 可以自动生成查询,而不需要手动编写 SQL。

总结:

Spring JPA 通过简化数据库操作和集成事务管理,使得开发人员可以更轻松地实现数据持久化层。它将复杂的数据库操作封装起来,使开发者可以专注于应用程序的业务逻辑。

Spring Boot项目依赖

<!-- JPA是针对数据库的操作,需要引入对应的数据库 -->

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.2.5.RELEASE</version>
</dependency>

配置数据源

spring:
  jpa:
    open-in-view: false
    # 控制是否打印运行时的SQL语句与参数信息
    show-sql: true

创建实体类

@Entity
@Table(name = "sys_brand")
@Data
public class SysBrandRes {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long brandId;

    /**
     * 品牌编码
     */
    private String brandCode;

    /**
     * 品牌名称
     */
    private String brandName;

    /**
     * 显示顺序
     */
    private Integer brandSort;
}

创建Controller类

/**
 * 添加
 * @param sysBrandRes
 * @return
 */
@PostMapping
public ResponseEntity<SysBrandRes> brandAdd(@RequestBody SysBrandRes sysBrandRes){
    SysBrandRes sysBrand=sysBrandService.add(sysBrandRes);
    return new ResponseEntity<>(sysBrand, HttpStatus.CREATED);
}

/**
 * 根据品牌名查询和分页查询
 * @param brandName
 * @param page
 * @param size
 * @return
 */
@GetMapping("/pageBrands")
public Page<SysBrandRes> brandList(@RequestParam String brandName,
                                   @RequestParam(defaultValue = "0") int page,
                                   @RequestParam(defaultValue = "10")int size
){
    return sysBrandService.searchBrands(brandName,page,size);
}

/**
 * 删除
 * @param brandId
 * @return
 */
@DeleteMapping("/{brandId}")
public ResponseEntity<SysBrandRes> brandDel(@PathVariable Long brandId){
      sysBrandService.del(brandId);
    return new ResponseEntity<>( HttpStatus.NO_CONTENT);
}

/**
 * 修改
 * @param brandId
 * @param sysBrandRes
 * @return
 */
@PutMapping("/{brandId}")
public ResponseEntity<SysBrandRes> upd(@PathVariable Long brandId,@RequestBody SysBrandRes sysBrandRes){
    SysBrandRes brandRes=sysBrandService.upd(brandId,sysBrandRes);
    if(brandRes!= null){
        return new ResponseEntity<>(brandRes,HttpStatus.OK);
    }
    return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}

创建Service类

接口

Page<SysBrandRes> searchBrands(String brandName, int page, int size);

SysBrandRes add(SysBrandRes sysBrandRes);

void del( Long brandId);

SysBrandRes upd(Long brandId, SysBrandRes sysBrandRes);

实现类

 @param brandName
 * @param page
 * @param size
 * @return
 */

@Override
public Page<SysBrandRes> searchBrands(String brandName, int page, int size) {
    PageRequest pageRequest = PageRequest.of(page, size);
    return brandRespository.findByBrandNameContaining(brandName,pageRequest);
}

/**
 * 添加
 * @param sysBrandRes
 * @return
 */
@Override
public SysBrandRes add(SysBrandRes sysBrandRes) {
    return brandRespository.save(sysBrandRes);
}

/**
 * 删除
 * @param brandId
 */
@Override
public void del(Long brandId) {
    brandRespository.deleteById(brandId);
}

/**
 * 修改
 * @param brandId
 * @param sysBrandRes
 * @return
 */
@Override
public SysBrandRes upd(Long brandId, SysBrandRes sysBrandRes) {
    // 检查指定的品牌 ID 是否存在于数据仓库中
    if(brandRespository.existsById(brandId)) {
        // 如果品牌存在,设置传入的品牌对象的 ID 为指定的品牌 ID
        sysBrandRes.setBrandId(brandId);
        // 将更新后的品牌对象保存到数据仓库,并返回保存后的对象
        return brandRespository.save(sysBrandRes);
    }
    // 如果品牌不存在,返回 null
    return null;
}

创建Repository接口

@Repository
public interface BrandRespository extends JpaRepository<SysBrandRes,Long> {

    Page<SysBrandRes> findByBrandNameContaining(String brandName, Pageable pageable);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring使用xml方式整合第三方框架流程详解

    Spring使用xml方式整合第三方框架流程详解

    这篇文章主要介绍了Spring使用xml方式整合第三方框架流程,Spring会在应用上下文中为某个bean寻找其依赖的bean,Spring中bean有三种装配机制,分别是:在xml中显式配置、在java中显式配置、隐式的bean发现机制和自动装配
    2023-02-02
  • 深入学习Java单元测试(Junit+Mock+代码覆盖率)

    深入学习Java单元测试(Junit+Mock+代码覆盖率)

    在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。下面我们就来详细学习下java单元测试吧
    2019-06-06
  • Java设计模式之适配器模式

    Java设计模式之适配器模式

    这篇文章介绍了Java设计模式之适配器模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Java IO流之StringWriter和StringReader用法分析

    Java IO流之StringWriter和StringReader用法分析

    这篇文章主要介绍了Java IO流之StringWriter和StringReader用法分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 老生常谈JVM的内存溢出说明及参数调整

    老生常谈JVM的内存溢出说明及参数调整

    下面小编就为大家带来一篇老生常谈JVM的内存溢出说明及参数调整。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 整理Java编程中字符串的常用操作方法

    整理Java编程中字符串的常用操作方法

    这篇文章主要介绍了Java编程中字符串的常用操作方法的整理,字符串处理是Java入门学习中的基础知识,需要的朋友可以参考下
    2016-02-02
  • Spring框架实现依赖注入的原理

    Spring框架实现依赖注入的原理

    依赖注入是由“依赖”和“注入”两个词汇组合而成,那么我们再一次顺藤摸瓜,分别分析这两个词语,这篇文章主要介绍了Spring DI依赖注入详解,需要的朋友可以参考下
    2023-04-04
  • Mybatis表的关联查询详情

    Mybatis表的关联查询详情

    这篇文章主要介绍了Mybatis表的关联查询详情,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java之Spring注解开发案例详解

    Java之Spring注解开发案例详解

    这篇文章主要介绍了Java之Spring注解开发案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 一个简单的Python名片管理系统

    一个简单的Python名片管理系统

    这篇文章主要为大家详细介绍了一个简单的Python名片管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论