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. 我们将…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
