企业级信息系统开发讲课笔记4.7 Spring Boot整合JPA

news2024/9/29 7:27:58

文章目录

  • 零、学习目标
  • 一、Spring Data JPA概述
    • 1、Spring Data JPA简介
    • 2、Spring Data JPA基本使用
    • 3、使用Spring Data JPA进行数据操作的多种实现方式
    • 4、自定义Repository接口中的@Transactional注解
    • 5、变更操作,要配合使用@Query与@Modify注解
  • 二、Spring Boot整合JPA
    • (一)创建Spring Boot项目JPADemo
    • (二)创建ORM实体类
      • 1、创建评论实体类 - Comment
      • 2、创建文章实体类 - Article
    • (三)创建自定义JpaRepository接口 - ArticleRepository
    • (四)添加数据源依赖,配置数据源属性
      • 1、在pom.xml里添加阿里巴巴数据源依赖
      • 2、在全局配置文件里配置数据源
      • 3、在测试类里编写测试方法
        • (1)注入文章仓库 - ArticleRepository
        • (2)创建测试方法testFindAll()
      • 课堂练习:测试其它方法
  • 三、利用JPA实现个性化操作
    • (一)案例 - 根据文章编号分页查询评论
      • 1、创建评论仓库接口 - CommentRepository
      • 2、定义按文章编号分页查询评论的方法
      • 3、创建测试类 - CommentTests
      • 4、在测试类里创建测试方法
        • (1)创建测试方法testFindCommentPagedByArticleId01()
        • (2)创建测试方法testFindCommentPagedByArticleId02()
    • (二)案例 - 根据文章编号更新作者
      • 1、在评论仓库接口里编写updateAuthorByArticleId()方法
      • 2、在测试类CommentTests里创建测试方法testUpdateAuthorByArticleId()
    • (三)案例 - 根据评论作者删除评论记录
      • 1、在评论仓库接口里编写deleteCommentByAuthor()方法
      • 2、在测试类CommentTests里创建测试方法testDeleteCommentByAuthor()
  • 四、利用JPA默认方法实现个性化操作
    • (一)案例 - 根据文章编号更新作者
    • (二)案例 - 根据评论作者删除评论记录

零、学习目标

  1. 熟悉Spring Data JPA基本语法和使用
  2. 掌握Spring Boot与JPA的整合使用

一、Spring Data JPA概述

1、Spring Data JPA简介

  • Spring Data JPA (JPA: Java Persistence API)是Spring基于ORM框架、JPA规范的基础上封装的一套JPA应用框架,它提供了增删改查等常用功能,使开发者可以用较少的代码实现数据操作,同时还易于扩展。

2、Spring Data JPA基本使用

  • 编写ORM实体类:实体类与数据表进行映射,并且配置好映射关系。
  • 编写Repository接口:针对不同的表数据操作编写各自对应的Repository接口,并根据需要编写对应的数据操作方法。

3、使用Spring Data JPA进行数据操作的多种实现方式

  • 如果自定义接口继承了JpaRepository接口,则默认包含了一些常用的CRUD方法。
  • 自定义Repository接口中,可以使用@Query注解配合SQL语句进行数据的查、改、删操作。
  • 自定义Repository接口中,可以直接使用方法名关键字进行查询操作。

4、自定义Repository接口中的@Transactional注解

  • 在自定义的Repository接口中,针对数据的变更操作(修改、删除),无论是否使用了@Query注解,都必须在方法上方添加@Transactional注解进行事务管理,否则程序执行就会出现InvalidDataAccessApiUsageException异常。
  • 如果在调用Repository接口方法的业务层Service类上已经添加了@Transactional注解进行事务管理,那么Repository接口文件中就可以省略@Transactional注解。

5、变更操作,要配合使用@Query与@Modify注解

  • 在自定义的Repository接口中,使用@Query注解方式执行数据变更操作(修改、删除),除了要使用@Query注解,还必须添加@Modifying注解表示数据变更。

二、Spring Boot整合JPA

(一)创建Spring Boot项目JPADemo

  • 设置项目元数据
    在这里插入图片描述
  • 添加项目依赖
    在这里插入图片描述
  • 设置项目名称与保存位置
    在这里插入图片描述
  • 完成项目初始化工作
    在这里插入图片描述

(二)创建ORM实体类

  • ORM: Object Relation Mapping 对象关系映射 (Object: Java Bean; Relation: Table)

1、创建评论实体类 - Comment

在这里插入图片描述

package net.hw.lesson07.bean;

import javax.persistence.*;

/**
 * 功能:评论实体类
 * 作者:华卫
 * 日期:2021年05月12日
 */
@Entity(name = "t_comment")
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @Column(name = "content")
    private String content;
    @Column(name = "author")
    private String author;
    @Column(name = "a_id")
    private Integer aId;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Integer getaId() {
        return aId;
    }

    public void setaId(Integer aId) {
        this.aId = aId;
    }

    @Override
    public String toString() {
        return "Comment{" +
                "id=" + id +
                ", content='" + content + '\'' +
                ", author='" + author + '\'' +
                ", aId=" + aId +
                '}';
    }
}
  • @Entity中的name对应数据库中表名
  • GenerationType.IDENTITY为MySQL中自增使用的策略,不同类型的数据库使用策略不同

2、创建文章实体类 - Article

在这里插入图片描述

package net.hw.lesson07.bean;

import javax.persistence.*;
import java.util.List;

/**
 * 功能:文章实体类
 * 作者:华卫
 * 日期:2021年05月12日
 */
@Entity(name = "t_article")
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @Column(name = "title")
    private String title;
    @Column(name = "content")
    private String content;
    // 查询时将子表一并查询出来
    @OneToMany(fetch = FetchType.EAGER) // FetchType.LAZY 懒加载
    @JoinTable(name = "t_comment", joinColumns = {@JoinColumn(name = "a_id")},
                inverseJoinColumns = {@JoinColumn(name = "id")})
    private List<Comment> commentList;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public List<Comment> getCommentList() {
        return commentList;
    }

    public void setCommentList(List<Comment> commentList) {
        this.commentList = commentList;
    }

    @Override
    public String toString() {
        return "Article{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", commentList=" + commentList +
                '}';
    }
}

(三)创建自定义JpaRepository接口 - ArticleRepository

在这里插入图片描述

  • 创建文章仓库接口ArticleRepository
    在这里插入图片描述
package net.hw.lesson07.repository;

import net.hw.lesson07.bean.Article;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * 功能:文章仓库接口
 * 作者:华卫
 * 日期:2020年08月11日
 */
public interface ArticleRepository extends JpaRepository<Article, Integer> {
}
  • 注意,接口里什么代码也没写,是不是感觉很简单?

(四)添加数据源依赖,配置数据源属性

1、在pom.xml里添加阿里巴巴数据源依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.6</version>
</dependency>

在这里插入图片描述

2、在全局配置文件里配置数据源

# 配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/blog?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=p@ssw0rd
spring.datasource.druid.max-active=100
spring.datasource.druid.min-idle=10
spring.datasource.druid.initial-size=20

在这里插入图片描述

3、在测试类里编写测试方法

  • 点开项目测试类
    在这里插入图片描述

(1)注入文章仓库 - ArticleRepository

在这里插入图片描述

(2)创建测试方法testFindAll()

在这里插入图片描述

  • 运行测试方法,查看结果
    在这里插入图片描述

课堂练习:测试其它方法

在这里插入图片描述

  • 测试findById()方法
  • 测试save()方法
  • 测试deleteById()方法

三、利用JPA实现个性化操作

  • 豆瓣图书的书评是分页显示,每页最多20条书评
    在这里插入图片描述

(一)案例 - 根据文章编号分页查询评论

1、创建评论仓库接口 - CommentRepository

在这里插入图片描述

package net.hw.lesson07.repository;

import net.hw.lesson07.bean.Comment;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * 功能:评论仓库接口
 * 作者:华卫
 * 日期:2020年08月11日
 */
public interface CommentRepository extends JpaRepository<Comment, Integer> {
}

2、定义按文章编号分页查询评论的方法

/**                                                                             
 * 根据文章ID进行分页查询评论                                                               
 * nativeQuery = true, 表示使用原生SQL语句,否则使用HQL语句                                    
 * @param aId 查询条件字段(文章编号)                                                      
 * @param pageable 可分页对象,分页查询需要该参数                                              
 * @return 返回page对象,包含page的相关信息及查询结果集                                           
 */                                                                             
@Query(value = "select * from t_comment where a_id = ?1", nativeQuery = true)   
Page<Comment> findCommentPagedByArticleId01(Integer aId, Pageable pageable);    
                                                                                
/**                                                                             
 * 根据文章ID进行分页查询评论                                                               
 * 没有设置nativeQuery,默认就是false,表示使用HQL语句                                          
 * @param aId 查询条件字段(文章编号)                                                      
 * @param pageable 可分页对象,分页查询需要该参数                                              
 * @return 返回page对象,包含page的相关信息及查询结果集                                           
 */                                                                             
@Query(value = "select c from t_comment c where c.aId = ?1")                    
Page<Comment> findCommentPagedByArticleId02(Integer aId, Pageable pageable);    
  • 分页类:Pageable完整路径是org.springframework.data.domain.Pageable,导包不要导错了
  • 两种查询方式:原生sql查询和基于对象的查询,两种方式可以任意选择一种。注意,@Query注解不设置nativeQuery属性,默认就是基于对象的查询。
  • 基于对象的查询:@Query(value = "select c from t_comment c where c.aId = ?1"),t_comment取个别名c,可以理解为表所对应的实体,select子句不能用*,必须用c,表明查询实体的所有属性,如果要查询实体的某些属性,那么可以这样写:@Query(value = "select c.id, c.author, c.content from t_comment c where c.aId = ?1");where子句不能用表的字段名a_id,而应该用对应实体的属性aId,但是要用实体c作前缀,即c.aId。占位符:?1表示第一个占位符,当然第二个占位符就是?2

3、创建测试类 - CommentTests

在这里插入图片描述

  • 添加测试注解,注入评论仓库
    在这里插入图片描述

4、在测试类里创建测试方法

在这里插入图片描述

  • 文章编号为1的评论有3条,下面我们将3条评论分两页显示,每页大小为2(最多两条记录)。第1页:id为1和3的两条评论;第2页:id为7的一条评论。

(1)创建测试方法testFindCommentPagedByArticleId01()

  • 设置pageIndex = 0,表明当前页为第1页
  • 设置pageSize = 2,表明每页最多两条记录
    在这里插入图片描述
package net.hw.lesson07;

import net.hw.lesson07.bean.Comment;
import net.hw.lesson07.repository.CommentRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * 功能:测试评论查询方法.
 * 作者:华卫
 * 日期:2021年05月12日
 */
@SpringBootTest
public class CommentTests {
    @Autowired // 注入评论仓库
    private CommentRepository commentRepository;

    @Test // 测试按文章编号分页查询评论,采用原生SQL语句
    public void testFindCommentPagedByArticleId01() {
        // 当前页面索引
        int pageIndex = 0; // 当前页 - 第1页
        // 设置页面大小
        int pageSize = 2; // 每页最多2条记录
        // 创建分页器
        Pageable pageable = PageRequest.of(pageIndex, pageSize);
        // 查询文章编号为1的页面对象
        Page<Comment> page = commentRepository.findCommentPagedByArticleId01(1, pageable);
        // 获取页面对象里的评论列表
        List<Comment> comments = page.getContent();
        // 获取总页数
        int totalPages = page.getTotalPages();
        // 输出页面信息
        System.out.println("当前页:" + (pageIndex + 1));
        System.out.println("总页数:" + totalPages);
        // 输出当前页全部评论
        comments.forEach(comment -> System.out.println(comment));
    }
}                                   
  • 运行测试方法,查看结果
    在这里插入图片描述

  • 修改页索引值为1,显示第2页评论
    在这里插入图片描述

  • 假如希望每页评论按照评论编号降序排列,那么该如何操作呢?

  • Sort.Direction.DESC - 降序;Sort.Direction.ASC - 升序
    在这里插入图片描述

  • 运行测试方法,查看结果
    在这里插入图片描述

  • 当然也可以按照评论表其它字段来排序,比如按contentauthor排序,大家不妨尝试一下,看看结果如何。

(2)创建测试方法testFindCommentPagedByArticleId02()

在这里插入图片描述

  • 运行测试方法,查看结果
    在这里插入图片描述
  • 大家可以看到,运行结果跟testFindCommentPagedByArticleId01()测试方法最后一次运行结果是完全一样的。不论是原生sql查询还是基于对象的查询,最终分页查询的效果是相同的。

(二)案例 - 根据文章编号更新作者

1、在评论仓库接口里编写updateAuthorByArticleId()方法

在这里插入图片描述

2、在测试类CommentTests里创建测试方法testUpdateAuthorByArticleId()

在这里插入图片描述

  • 运行测试方法,查看结果
    在这里插入图片描述
  • 在Navicat里打开评论表,查看文章编号为1的评论作者是不是都改成了“无心剑”
    在这里插入图片描述

(三)案例 - 根据评论作者删除评论记录

1、在评论仓库接口里编写deleteCommentByAuthor()方法

在这里插入图片描述

2、在测试类CommentTests里创建测试方法testDeleteCommentByAuthor()

在这里插入图片描述

  • 运行测试方法,查看结果
    在这里插入图片描述
  • 在Navicat里打开评论表,看看作者为“无心剑”的评论是否被删除了。
    在这里插入图片描述
  • 运行blog.sql脚本,恢复数据库blog的原始数据
    在这里插入图片描述
    在这里插入图片描述

四、利用JPA默认方法实现个性化操作

  • 在生产实际中,绝大多数的功能都可用JPA提供的默认方法进行实现。

(一)案例 - 根据文章编号更新作者

  • 在测试类CommentTests里创建测试方法testUpdateAuthorByArticleId02()

  • 基本思路:查出所有文章编号为1的记录,然后修改作者为“无心剑”,再保存。
    在这里插入图片描述

  • 运行测试方法,查看结果
    在这里插入图片描述

  • 在Navicat里打开评论表,看看文章编号为1的评论作者是否都改成了“无心剑”
    在这里插入图片描述

(二)案例 - 根据评论作者删除评论记录

  • 在测试类CommentTests里创建测试方法testDeleteCommentByAuthor02()
    • 基本思路:查出评论作者为“无心剑”的记录,然后逐个删除。
      在这里插入图片描述
  • 运行测试方法,查看结果
    在这里插入图片描述
  • 在Navicat里打开评论表,看看作者为“无心剑”的评论是否被删除了。
    在这里插入图片描述
  • 运行blog.sql脚本,恢复数据库blog的原始数据
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/636786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

热门图表软件推荐,哪款更功能更强大?

在如今的数据化时代&#xff0c;各种企业都需要有一套高效的报表制作工具。而图表是报表中最常用、也是最重要的一部分&#xff0c;因此选择一款优秀的图表软件显得尤为重要。本文将为大家介绍5款热门图表软件&#xff0c;并突出介绍VeryReport图表软件的优势。 1. VeryReport…

NetApp 全闪存 ASA 系统可为您的任务关键型企业级应用程序、数据库和 VMware 基础架构提供简单专用的块存储

NetApp ASA&#xff1a;全闪存 SAN 阵列 在性能和效率之间进行艰难抉择的时代已经过去。NetApp ASA 系统提供简单专用的块存储&#xff0c;具有卓越的性能、高可用性和领先的效率 — 无需权衡取舍。 为什么选择适用于 SAN 的 NetApp ASA 系统&#xff1f; 简单的 SAN 存储&…

DCL单例及synchrosized问题

疑问待解&#xff1a; 1 synchronized代码块执行完后&#xff0c;在没有return INSTANCE之前&#xff0c;其他线程是否可见这个对象&#xff08;因为synchronized出块后会把工作内存写到主存&#xff09;&#xff1f; 如果可见&#xff0c;那么return的作用是不是可有可无&…

object类型(equals、hashCode、getClass、getName)

equals方法的改写 Override//重写equals方法&#xff0c;重写方法后对比的属性值&#xff08;没有重写前对比的是属性值&#xff09;public boolean equals(Object obj) {Students s (Students) obj;return this.name.equals(s.name) && this.age s.age;}public clas…

学顶教育:中级统计师单科成绩计算方式分享!

中级统计师的成绩管理是非滚动式的&#xff0c;所以需要考生一次考下两个科目&#xff0c;两个科目都合格之后&#xff0c;才能取得证书。 中级统计师的考试&#xff0c;是每年举行一次&#xff0c;全部考试科目合格者&#xff0c;授予由人事部统一印制、全国范围内有效的《统…

从结构上浅谈FPGA LCMXO2-4000HC-6BG256I 实现逻辑的基本原理

LCMXO2-4000HC-6BG256I lattice莱迪思深力科 MachXO2 可编程逻辑器件 (PLD) 由六个超低功耗、即时启动、非易失性 PLD 组成&#xff0c;可提供 256 至 6864 个查找表 (LUT) 的密度。 MachXO2 系列 PLD 提供多种特性&#xff0c;例如嵌入式块 RAM (EBR)、分布式 RAM 和用户闪存 …

叽里呱啦 Nacos 1.1.4 升级 1.4.1 最佳实践

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

VTK学习之读取图片,vtkImageViewer2的使用

一、vtk中的vtkImageData VTK提供相对应的类对图像文件进行读写操作 测试下效果&#xff1a; int main() {//vtkSmartPointer<vtkBMPReader> reader vtkSmartPointer<vtkBMPReader>::New();//reader->SetFileName("**\\12.bmp");vtkSmartPointer&l…

【分享】Heic图片如何批量转换成jpg格式?

我们知道&#xff0c;Heic是苹果产品的专属图片格式&#xff0c;但不是所有Windows系统都可以查看&#xff0c;而且很多需要上传图片的平台也不支持Heic格式&#xff0c;这些情况就需要把Heic转换成JPG等常用的图片格式。 如果图片数量非常多&#xff0c;要如何实现批量转换呢…

<Windows>《Windows当前桌面壁纸的位置》

《Windows当前桌面壁纸的位置》 问题&#xff1a; 想找到当前桌面壁纸的位置&#xff0c;该怎么做&#xff1f; 解决&#xff1a; win7之后&#xff0c;windows壁纸以注册表存在。注册表位置为&#xff1a; HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper该值记录了位置…

JWT验证

JSON Web Token 入门教程 - 阮一峰的网络日志 (ruanyifeng.com) 补充上时间线&#xff1f;画图&#xff1f; 隐患是什么 为什么一开始不这么做 这个封面挺好做的&#xff0c;以后笔记我也做一个&#xff0c;&#xff0c;要是能自动生成就好了 一、认证 为了保存信息用的&#…

【深度学习】日常笔记3

如果分类问题具有预测这样带有自然顺序的问题&#xff0c;如{婴⼉, ⼉童, ⻘少年, ⻘年⼈, 中年⼈, ⽼年⼈}&#xff0c;那么可以把分类问题转变为回归问题了。不过可以使用独热编码one-hot encoding。 类别对应的分量设置为1&#xff0c;其他所有分量设置为0。在我们的例⼦中…

Cadence原理图快速查找元器件的方法

1.Cadence原理图快速查找元器件的方法 ①在红框中输入元器件编号&#xff0c;点击望远镜的图标在底下的状态栏可看到查找到的相关元器件&#xff0c;点击元器件可自动定位当前元器件的位置。 ②点击hierarchy&#xff08;层&#xff09;可自主查找&#xff0c;找到后点击序号即…

【项目实战】一、Spring boot整合JWT、Vue案例展示用户鉴权

前言 案例整合了Spring boot、Spring Cloud alibaba、Gateway、Nacos discovery、Nacos config、openFeign、JWT、Vue3、Router、Axios等&#xff1b;通过JWT和登录、查询&#xff08;带用户信息&#xff09;接口&#xff0c;验证了上述工具以及鉴权功能。 1、若无公共模块&a…

学好Java爬虫需要什么技巧

Java爬虫是一种利用Java编程语言编写的网络爬虫程序&#xff0c;它可以自动化地浏览和抓取互联网上的数据&#xff0c;并将数据进行处理和保存。Java爬虫通常使用HTTP协议模拟浏览器请求来获取网页内容&#xff0c;并通过解析HTML网页标签和属性等信息来提取有用的数据。Java爬…

PPT处理控件Aspose.Slides入门教程:在 C# 中加密和解密 PPT

Aspose API支持流行文件格式处理&#xff0c;控件覆盖 word、excel、PDF、条码、OCR、CAD、HTML、email、ppt、等各个文档管理领域 是一款 PowerPoint管理API&#xff0c;用于读取&#xff0c;编写&#xff0c;操作和转换PowerPoint幻灯片的独立API&#xff0c;可将PowerPoint…

【网页设计】第 2 课 - 网页设计规范

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、网页规范 3、设计规范 4、banner 简介 4.1、Banner 的定义 4.2、Banner 的类型 4.3、Banner 构图 4.4、…

chatgpt赋能python:Python学习笔记:如何合并元组

Python学习笔记&#xff1a;如何合并元组 在Python中&#xff0c;元组是一种不可变的数据结构。当我们需要组合不同的元组时&#xff0c;我们可以使用元组合并的方法来实现。在本文中&#xff0c;我们将学习如何使用Python语言来合并元组。 什么是元组 在Python语言中&#…

windows 服务程序和桌面程序集成(六)集成安装、启动、卸载功能

系列文章目录链接&#xff1a; windows 服务程序和桌面程序集成&#xff08;一&#xff09;概念介绍windows 服务程序和桌面程序集成&#xff08;二&#xff09;服务程序windows 服务程序和桌面程序集成&#xff08;三&#xff09;UDP监控工具windows 服务程序和桌面程序集成&…

AntDesign——TableAPI学习

table表格用于展示数据 https://ant.design/components/table-cn#table 1.bordered false不显示每一个小表格的边框&#xff0c;true反之 2.columns 列名及列数据&#xff0c;接受columns数组 2.1 colums中必须声明的属性 title&#xff08;列标题&#xff09; dataInde…