JPA (Java Persistence API)
一、Jpa的介绍
JPA ,是一套Sun公司Java官方制定的ORM 规范。
二、JPA实现流程:
2.1 ORM 映射
@Entity
@Table(name = "user")
public class User {@Id// 该字段对应数据库中的列为主键@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增长@Column(name = "id")private Long id;@Column(name = "name")private String name;@Column(name = "age")private Integer age;@Column(name = "sex")private String sex;
}
2.2 继承CrudRepository(或者JpaRepository)
新建接口,通过继承 CrudRepository 实现 CRUD 操作
@Repository
public interface UserDao extends CrudRepository<User,Long> {
}
2.3 添加服务层
@Service
public class UserService {@Autowiredprivate UserDao userDao;public void add(User user) {userDao.save(user);}
}
2.4 @EnableJpaRepositories
如果你的 Repository 接口位于与启动类不同的包中,或者你希望配置不同的数据源,这种情况下就需要使用 @EnableJpaRepositories
注解来明确地指定需要扫描的包。
2.5 JpaRepository与CrudRepository的差异及不同的使用场景
JpaRepository
和CrudRepository
是 Spring Data JPA 框架提供的两个接口,它们都提供了一套用于在数据库中执行 CRUD(创建、读取、更新、删除)操作的方法。下面是它们之间的差异及不同的使用场景:
CrudRepository
:
CrudRepository
是 Spring Data 提供的基础接口,定义了一组基本的 CRUD 操作方法,例如save
、findById
、findAll
、delete
等。CrudRepository
接口中的方法是非类型化的,返回类型为Iterable
,需要手动进行类型转换。CrudRepository
适用于简单的 CRUD 操作,不涉及复杂的查询和操作。
JpaRepository
:
JpaRepository
是继承自CrudRepository
接口的一个子接口,提供了更丰富和强大的查询功能,例如通过方法名自动生成查询、使用@Query
注解执行自定义 SQL 查询等。JpaRepository
接口中的方法返回类型为具体的实体类,无需进行手动类型转换。JpaRepository
适用于需要进行复杂查询和定制化操作的场景,能够更方便地实现各种复杂的数据操作需求。- 分页和排序:
JpaRepository
提供了一些方法,如findAll(Pageable pageable)
和findAll(Sort sort)
,用于支持结果的分页和排序。- 刷新持久性上下文:
JpaRepository
提供了flush()
和saveAndFlush(T entity)
方法,用于刷新持久性上下文,即使未提交的变更立即同步到数据库。- 批量操作:
JpaRepository
提供了deleteInBatch(Iterable<T> entities)
和deleteAllInBatch()
方法,可以进行批量的删除操作。使用场景:
- 当只需要进行简单的 CRUD 操作时,例如基本的增删改查,可以使用
CrudRepository
。- 当需要进行复杂的查询或操作时,例如需要使用动态查询、分页查询、自定义查询等功能时,应该使用
JpaRepository
。 -如果应用中有复杂的业务逻辑、需求,并且需要更灵活地操作数据库,那么建议选择JpaRepository
。
总的来说,JpaRepository
提供了CrudRepository
所有的功能,另外还提供了更多的查询方法以及对实体的操作功能。因此,如果有需要进行更复杂的数据库操作或查询时,推荐使用JpaRepository
。
三、JPA的审计功能
@EntityListeners(AuditingEntityListener.class)
是 JPA 的注解,它用于定义在持久化过程中应用于实体类的回调方法类,也就是说,它将指定的类配置为实体监听器。
AuditingEntityListener
是 Spring Data JPA 提供的一个实体监听器,专门用于审计,即追踪和记录实体的创建、修改等行为。
一个典型的使用场景是,你想要追踪并自动填充实体的创建时间和最后修改时间。这可以通过 Spring Data JPA 的审计功能来实现。示例代码如下:
3.1 新增一个 AbstractAuditable 的抽象类
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AbstractAuditable {@Id@Column(name = "id", nullable = false)@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@CreatedDate@Column(name = "create_time", nullable = true)private Date createTime;@CreatedBy@Column(name = "create_user_id", nullable = true)private Integer createUserId;@LastModifiedBy@Column(name = "last_modified_user_id", nullable = true)private Integer lastModifiedUserId;@LastModifiedDate@Column(name = "last_modified_time", nullable = true)private Date lastModifiedTime;
......
}
@CreatedDate
和 @LastModifiedDate
是审计注解,分别表示创建时间和最后修改时间。当你保存或更新User实体的时候, createdTime
和 lastModifiedTime
会自动被填充。
3.2 实现 AuditorAware 接口,实现 getCurrentAuditor 方法
@CreatedBy
和 @LastModifiedBy
注解负责跟踪数据记录的创建者和最后一次修改者。这两个注解通常用于持久化域对象,以实现审计(审核)功能。然而,Spring Data本身无法自动获取到当前的用户ID。它依赖于AuditorAware
接口来设定用户身份。你必须提供AuditorAware
的实现类,告诉Spring Data应该用什么作为当前用户或当前操作者。
举例来说,你如果在使用Spring Security这种安全框架,你可以从SecurityContext获取到当前用户信息,并通过AuditorAware
返回给Spring Data。代码示例如下:
public class SpringSecurityAuditorAware implements AuditorAware<User> {@Overridepublic Optional<User> getCurrentAuditor() {return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).filter(Authentication::isAuthenticated).map(Authentication::getPrincipal).map(User.class::cast);}
}
在这个例子中,我们从SecurityContextHolder
中获取了当前的Authentication
对象,确保了它是已认证的,然后得到了principal
(在许多情况下,principal
通常就是你的User
对象或者是包含User
对象信息的对象),最后将这个principal
转换成了User
对象并包装在Optional
中返回。这样,每次需要自动填充@CreatedBy
和@LastModifiedBy
字段时,Spring Data就可以知道当前用户是谁了。
3.3 需要 Auditing 的实体继承 AbstractAuditable
@Entity
@Table(name = "user")
public class User extends AbstractAuditable{@Id// 该字段对应数据库中的列为主键@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增长@Column(name = "id")private Long id;@Column(name = "name")private String name;@Column(name = "age")private Integer age;@Column(name = "sex")private String sex;
}
3.4 审计配置
要启用 Spring Data JPA 的审计功能,你还需要在某个配置类中添加 @EnableJpaAuditing
注解。
要是实现了AuditorAware接口,则同样需要配置。
@EnableJpaAuditing
@Configuration
public class JpaConfig {@Beanpublic AuditorAware<Integer> auditorProvider() {return new SpringSecurityAuditorAware ();}
}
四、JPA与MybatisPlus对比
JPA和MybatisPlus都是Java持久化框架,但有一些不同之处,下面是它们的优缺点及不同的使用场景:
JPA:
- 优点:
- 对象关系映射(ORM)方便,通过注解或XML配置的方式可以轻松地实现实体类和数据表的映射关系。
- 提供了强大的查询语言JPQL,可以灵活地进行查询操作。
- 支持事务管理和持久性上下文,能够帮助开发者管理实体对象的生命周期和事务。
- 缺点:
- 性能相对较低,对于复杂的查询性能不如MybatisPlus。
- 需要深入了解JPA规范和实现,学习成本较高。
- 不够灵活,有时候需要绕过JPA规范使用原生SQL。
MybatisPlus:
- 优点:
- 灵活性高,可以通过SQL语句自定义查询和更新操作,满足复杂业务需求。
- 性能优秀,对于复杂的查询操作能够更好地优化和提升性能。
- 配置简单,可以通过注解或XML配置文件快速实现功能。
- 缺点:
- 没有JPA那种ORM的便利性,需要手动编写SQL语句。
- 由于灵活性较高,开发者需要深入了解SQL语法和数据库,不易上手。
- 不提供自动实现的事务管理和持久性上下文,需要手动处理事务。
不同的使用场景:
- 如果项目中对数据库操作较为简单,大部分操作可以通过简单的CRUD操作实现,可以考虑使用JPA,确实能够减少很多繁琐的代码。
- 如果项目中需要进行复杂的查询操作,或者对性能要求较高,可以考虑使用MybatisPlus,它提供了更多的灵活性和优化性能的功能。
相关文章:

JPA (Java Persistence API)
一、Jpa的介绍 JPA ,是一套Sun公司Java官方制定的ORM 规范。 ORM,即 对象关系映射 (Object Relational Mapping),是一种程序技术,用于 在关系数据库和业务实体对象之间做映射 。ORM 框架的存在,…...

实战要求下,如何做好资产安全信息管理
文章目录 一、资产安全信息管理的重要性二、资产安全信息管理的痛点三、如何做好资产安全信息管理1、提升资产安全信息自动化、集约化管理能力,做到资产全过程管理2、做好资产的安全风险识别3、做好互联网暴露面的测绘与管空4、做好资产安全信息的动态稽核管理 “摸…...

[matlab]matcaffe在matlab2023a安装和配置过程
测试环境: caffe-windows-cpu-py35-matlab2018b-vs2015-20220321 matlab2023a 注意:由于matlab新版本不允许添加特殊目录,比如有和private目录,添加后也会警告,但是可以忽略。因此可以使用我研发的matlab环境添加工具…...

【word2pdf】Springboot word转pdf(自学使用)
文章目录 概要整体介绍具体实现官网pom文件增加依赖 遇到的问题本地运行OK,发布到Linux报错还是本地OK,但是Linux能运行的,但是中文乱码 小结 概要 Springboot word 转 pdf 整体介绍 搜了一下,发现了能实现功能的方法有四种 U…...

3_2Linux中内核级加强型火墙的管理
### 一.Selinux的功能 ### 观察现象 ①当Selinux未开启时 在/mnt中建立文件被移动到/var/ftp下可以被vsftpd服务访问 匿名用户可以通过设置后上传文件 当使用ls -Z /var/ftp查看文件时显示"?" ps auxZ | grep vsftpd 时显示: - root 8546 0.0 0.0 26952 …...

PCB工艺规范及PCB设计安规原则
一、目的 规范产品的PCB工艺设计,规定PCB工艺设计的相关参数,使得PCB的设计满足可生产性、可测试性、安规、EMC、EMI等的技术规范要求,在产品设计过程中构建产品的工艺、技术、质量、成本优势。 二、适用范围 本规范适用于所有电了产品的PCB工…...

Qt for Android 开发环境
在搭建环境时开始感觉还挺顺利的,从 Qt 配置的环境里面看并没有什么问题,可真正编译程序的时候发现全是错误。 最开始的时候安装了 JDK21 最新版本,然后根据 JDK21 安装 ndk, build-tools, Platform-Tools 和 Gradle,但是不管这么…...

【题解】BC64 牛牛的快递(C++)
#include <iostream> #include<string> #include<math.h> using namespace std;int main() {int c0;string b;float a;cin>>a>>b;if(a>1)c20ceil(a-1);elsec20;if(b"y")c5;cout<<c; }在C中,ceil() 函数用于返回大…...

C++(运算符重载+赋值拷贝函数+日期类的书写)
目录 运算符重载运算赋值重载和运算赋重载前置和后置<,<,>,>,,!运算符重载日期类的实现<<流插入和>>流提取的运算符重载总结 运算符重载 C为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回…...

【介绍下负载均衡原理及算法】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...

CESS 受邀出席香港Web3.0标准化协会第一次理事会议,共商行业未来
2024 年 4 月 5 日,CESS(Cumulus Encrypted Storage System)作为香港 Web3.0 标准化协会的副理事会成员,于香港出席了 2024 年度第一次理事会会议。此次会议汇聚了来自不同领域的知名企业和专家(参会代表名单见文末&am…...

MySQL 8.0.19安装教程(windows 64位)
在c盘目录下的Program Files目录下创建MySQL目录,将下载好的mysql解压到里面 解压完是这个样子 配置初始化的my.ini文件的文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirC:\Program Files\MySQL # 设置mysql数据库的数据的存放目录 datad…...

探索AI提示词网站:助力内容创作与AI对话
嗨,大家好!在这个充满创意的时代里,AI技术为我们带来了许多惊喜和便利。如果你是一个内容创作者,无论是在撰写博客还是进行科技对话,今天我将向大家介绍几个能够提升与AI对话效率的神奇网站。 1. FlowGPT 首先…...

AdaBoost 算法
目录 什么是 AdaBoost 算法? Adaboost 的 7 个优缺点 集成学习:人多力量大: Bagging:民主。Boosting :挑选精英。长短期记忆网络:引入遗忘机制 生成对抗网络 :物竞天择适者生存 首先,了解一下集成学习及 Boosting 算法 集成学习归属于机器学习,他是一种「训练思路…...

链接分析算法
链接分析(Link Analysis)通常指的是对图(Graph)中的节点(Nodes)和边(Edges)进行分析,以发现图的结构和属性。在图论中,链接分析算法通常用于解决诸如网页排名…...

怎么批量完成图片格式转换?介绍三种简单方法
在日常生活和工作中,我们经常会遇到需要将图片格式转换的情况,无论是为了适应不同的设备要求,还是为了能让我们的图片应用到更多的使用场景中去,批量图片格式转换都是一项非常实用的技能。本文将介绍一些常见的批量图片格式转换方…...

每日OJ题_BFS解决最短路③_力扣127. 单词接龙
目录 ③力扣127. 单词接龙 解析代码 ③力扣127. 单词接龙 127. 单词接龙 难度 困难 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk: 每一对相邻的单词只差一个字母。…...

微信小程序英文版:实现一键切换中英双语版(已组件化)
已经重新优化代码做成了组件,需要可自取:https://github.com/CrystalCAI11/wechat-language-compoment 所有操作都打包在组件里不需要在额外的地方添加代码,直接在你需要的页面里导入组件,再在对应页面的onLoad()里set文本就行了。…...

openstack之neutron介绍
核心组件 neutron-server:提供API接口,把对应的api请求传给plugin进; neutron-plugin:管理逻辑网络状态,调用agent; neutron-agent:在provider network上创建网络对象; neutron-…...

学习Rust的第三天:猜谜游戏
基于Steve Klabnik的《The Rust Programming Language》一书。今天我们在rust中建立一个猜谜游戏。 Introduction 介绍 We will build a game that will pick a random number between 1 to 100 and the user has to guess the number on a correct guess the user wins. 我们将…...

React中子传父的方式及原理
方式挺多的,先说最常用的通过props进行父子组件的数据传递和修改以及原理 在React中,props不仅用于传递数据,它们也可以传递可以执行的函数,这使得子组件能够间接更新父组件的状态。这种方法强化了React的单向数据流策略…...

【数据结构与算法】贪心算法及例题
目录 贪心算法例题一:找零问题例题二:走廊搬运物品最优方案问题输入样例例题三:贪心自助餐 贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,以期望最终达到全局最优解的算法。它的核心思想是每次都选择当前最…...

【Origin+Python】使用External Python批量出图代码参考
目录 基本介绍环境配置官方代码示例基础代码详解我的代码效果视频进阶代码及去水印 基本介绍 origin2021后可以使用python实现批量绘图,一共有两种方式:一种是嵌入式Python,一种是外部Python访问Origin。详细介绍可以自己去查看,打…...

YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先!
YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先! DySample超轻量动态上采样算子全文戳这!here! 详细的改进教程以及源码&am…...

ChatGPT基础(二) ChatGPT的使用和调优
文章目录 ChatGPT的特性采用关键词进行提问给ChatGPT指定身份提升问答质量的策略1.表述方式上的优化2.用"继续"输出长内容3.营造场景4.由浅入深,提升问题质量5.预设回答框架和风格 ChatGPT的特性 1.能够联系上下文进行回答 ChatGPT回答问题是有上下文的&…...

麒麟 V10 离线 安装 k8s 和kuboard
目录 安装文件准备 主机准备 主机配置 修改主机名(三个节点分别执行) 配置hosts(所有节点) 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包(所有节点) 系统参数设置(所有节点) 时间同步…...

PlayerSettings.WebGL.emscriptenArgs设置无效的问题
1)PlayerSettings.WebGL.emscriptenArgs设置无效的问题 2)多个小资源包合并为大资源包的疑问 3)AssetBundle在移动设备上丢失 4)Unity云渲染插件RenderStreaming,如何实现多用户分别有独立的操作 这是第381篇UWA技术知…...

项目管理工具——使用甘特图制定项目计划的详细步骤
甘特图是一种直观的项目管理工具,它有助于我们清晰地展示任务安排、时间管理和项目的进度。以下是使用甘特图制定项目计划的详细步骤: 1、创建项目:首先,在进度猫中创建新的项目,并设置项目的时间、工作日等参数。根据…...

python读取文件数据写入到数据库中,并反向从数据库读取保存到本地
学python,操作数据库是必不可少的,不光要会写python代码,还要会写SQL语句,本篇文章主要讲如何把本地txt文件中的数据读取出来并写入到对应的数据库中,同时将数据库单个表中的数据读出来保存在本地txt文件中。 话不多说…...

社交媒体数据恢复:Viber
Viber是一款流行的即时通讯应用,用于发送消息、语音通话和视频通话。然而,有时候我们会不小心删除一些重要的Viber聊天记录,这时候就需要进行数据恢复。本文将介绍如何在安卓设备上进行Viber数据恢复。 一、使用安卓数据恢复软件 安卓数据恢…...