Spring笔记06-数据持久化

在 Spring 中,数据持久化是将应用程序中的数据保存到持久化存储(如数据库)中的过程 ,主要通过以下几种方式实现:

1. JDBC(Java Database Connectivity)

  • 原理:JDBC 是 Java 访问关系型数据库的标准 API,提供了与数据库建立连接、执行 SQL 语句、处理结果集等功能。Spring 对 JDBC 进行了封装,通过JdbcTemplate等工具类简化数据库操作,降低了使用原生 JDBC 时繁琐的资源管理(如连接的获取、关闭等)和异常处理工作。
  • 示例:配置数据源后,注入JdbcTemplate,使用query方法查询数据,update方法执行增删改操作 。比如jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper<>(User.class));可将查询结果映射为User对象列表。
  • 适用场景:适用于对数据库操作性能要求较高,希望直接控制 SQL 语句,且数据库操作相对简单的场景。

2. JPA(Java Persistence API)

  • 原理:JPA 是 Java EE 规范,定义了对象与关系数据库之间的映射规则,以及对实体对象进行持久化操作的标准方式。它不是具体框架,而是一种规范,Hibernate 等是其常见实现。Spring Boot 可集成 JPA 实现,通过注解(如@Entity定义实体类、@Column定义列等 )来映射实体和数据库表结构。
  • 示例:定义实体类@Entity @Table(name = "user") public class User { @Id @GeneratedValue private Long id; @Column private String name; // 省略getter和setter } ,然后创建继承JpaRepository的接口UserRepository extends JpaRepository<User, Long>,即可利用其提供的 CRUD 方法操作数据库。
  • 适用场景:适用于关系型数据库场景,尤其在业务逻辑复杂、对象关系映射较多,希望以面向对象方式操作数据库,减少 SQL 编写量时使用。

3. Spring Data JPA

  • 原理:是 Spring 提供的基于 JPA 的模块,进一步简化 JPA 使用。它基于约定优于配置原则,根据方法命名规则可自动生成查询方法,还提供了分页、排序等高级功能,以及复杂查询 DSL(Domain-Specific Language) 。
  • 示例:除上述UserRepository继承JpaRepository使用默认方法外,还可自定义方法,如List<User> findByNameContaining(String name);,框架会自动生成相应 SQL 实现按名字模糊查询用户。
  • 适用场景:在使用 JPA 的基础上,进一步追求开发效率,减少样板代码编写,适用于大多数关系型数据库的 CRUD 操作及复杂查询场景。

4. MyBatis

  • 原理:是流行的持久化框架,支持自定义 SQL、存储过程及高级映射。MyBatis 使用 XML 或注解配置 SQL 语句与对象的映射关系,灵活控制 SQL 执行,可手动编写复杂 SQL 满足特定业务需求。
  • 示例:在 XML 中配置<select id="selectUser" parameterType="long" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> ,然后在 Mapper 接口中定义User selectUser(Long id); ,通过 MyBatis 的 SqlSessionFactory 获取 SqlSession 执行方法。
  • 适用场景:当对 SQL 语句的灵活性和性能优化有较高要求,如复杂的多表关联查询、存储过程调用等场景时适用。

此外,Spring 还提供事务管理机制来保证数据一致性,包括基于注解(@Transactional )的声明式事务管理和编程式事务管理;同时也支持多种数据库连接池技术,提升数据库连接的管理效率 。

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

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

相关文章

spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)

RedisTemplate 序列化器详细对比&#xff08;官方及非官方&#xff09; 1. 官方序列化器 (1) JdkSerializationRedisSerializer 特点&#xff1a; 基于 Java 原生序列化&#xff08;Serializable&#xff09;。支持复杂对象&#xff08;需实现 Serializable 接口&#xff09;…

ssh私钥文件登录问题:Load key invalid format

问题 在mac上面使用私钥文件登录时候&#xff0c;出现了如下错误&#xff1a; Load key “xxx.pem”: invalid format 但是&#xff0c;这个私钥文件在win上面能够正常使用ssh进行远程登录。在mac上面不能。而且&#xff0c;分别在win和mac上面分别查看了这两个私钥文件的md5…

AI战略群与星际之门:软银AI投资版图计划深度解析

一、星际之门:万亿美元级 AI 基础设施革命 1.1 项目背景与战略定位 在 AI 技术迅猛发展的今天,算力已成为推动其前进的核心动力。软银联合 OpenAI、甲骨文、英伟达、微软、arm推出的 “星际之门”(Stargate)计划,无疑是 AI 领域的一颗重磅炸弹。作为 AI 领域史上最大单笔…

教务系统ER图

实体 1. 学生&#xff1a;具有姓名、学号、性别、系编号、电话、出生年月等属性。学号通常是学生的唯一标识。 2. 课程&#xff1a;包含课程编号、课程名称、课程学分、课程学时等属性。课程编号一般用于唯一标识一门课程。 3. 教师&#xff1a;属性有教师编号、教师名字、性别…

大数据(4.4)Hive多表JOIN终极指南:7大关联类型与性能优化实战解析

目录 背景一、Hive JOIN类型与语法详解1. 基础JOIN类型2. 高级JOIN类型 二、JOIN实战案例与调优案例1&#xff1a;两表内连接&#xff08;订单与用户关联&#xff09;案例2&#xff1a;多表链式JOIN&#xff08;用户-订单-商品&#xff09;案例3&#xff1a;处理数据倾斜&#…

【28BYJ-48】STM32同时驱动4个步进电机,支持调速与正反转

资料下载&#xff1a;待更新。。。。 先驱动起来再说&#xff0c;干中学&#xff01;&#xff01;&#xff01; 1、实现功能 STM32同时驱动4个步进电机&#xff0c;支持单独调速与正反转控制 需要资源&#xff1a;16个任意IO口1ms定时器中断 目录 资料下载&#xff1a;待更…

[Lc6_记忆化搜索] 不同路径 | 解决智力问题 | 有序三元组中的最大值

目录 1.不同路径 题解 2140. 解决智力问题 题解 2873. 有序三元组中的最大值 题解 1.不同路径 链接&#xff1a;62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步…

软件重构与项目进度的矛盾如何解决

软件重构与项目进度之间的矛盾可以通过明确重构目标与范围、采用渐进式重构策略、优化项目管理流程、提高团队沟通效率、建立重构意识文化等方式解决。其中&#xff0c;采用渐进式重构策略尤为关键。渐进式重构是指在日常开发过程中&#xff0c;以小步骤持续进行重构&#xff0…

多台服务器上docker部署 Redis 集群

规划集群节点 确保你的服务器有固定 IP&#xff0c;比如&#xff1a; 172.16.17.100 172.16.17.101 172.16.17.102 每台服务器运行 2 个 Redis 节点&#xff0c;总共 6 个节点&#xff0c;满足 Redis Cluster 最小节点数要求。 2. 在每台服务器上运行 Redis 在每台服务器上执行…

【Pandas】pandas DataFrame dtypes

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于获取 DataFrame 的行索引DataFrame.columns用于获取 DataFrame 的列标签DataFrame.dtypes用于获取 DataFrame 中每一列的数据类型 pandas.DataFrame.dtypes pandas.DataFrame.dtypes 属性用…

如何实现局域网内无痛访问Jupyter Notebook?

Jupyter Notebook是数据科学和机器学习领域非常常用的交互式开发环境。默认情况下&#xff0c;Jupyter Notebook启动后只能本地访问&#xff0c;并且会自动生成一个token用于身份验证。当需要从其他电脑远程访问时&#xff0c;往往需要对配置进行修改。 本文将详细介绍如何通过…

[Windows] eDiary 4.3.6 日记软件

[Windows] eDiary 链接&#xff1a;https://pan.xunlei.com/s/VOMq6xmKTbEJtNaW-BXZ7KKSA1?pwdcrvu# 【应用功能】 加密 无论本地还是云端&#xff0c;都可以选择高强度加密。系统以用户密码为种子&#xff0c;对数据进行…

掌握 Flexbox 布局:为容器添加竖向滚动条的完美方案

掌握 Flexbox 布局&#xff1a;为容器添加竖向滚动条的完美方案 前言 在现代网页设计中&#xff0c;Flexbox 布局因其灵活性和强大的对齐功能而备受欢迎。然而&#xff0c;在实际开发过程中&#xff0c;我们有时会遇到需要在一个具有最小高度的 Flex 容器中实现内容溢出时显示…

Node.js v22.14.0 多平台安装指南:Windows、Linux 和 macOS 详细教程

Node.js作为现代Web开发的基石&#xff0c;持续为开发者带来性能提升和新特性支持。本文将详细介绍在Windows、macOS和Linux系统上安装最新Node.js的多种方法&#xff0c;助您快速搭建高效的JavaScript开发环境。 &#x1f4e6; 当前最新版本 截至2025年4月&#xff0c;Node.…

动态规划学习——回文子串系列问题【C++】

一&#xff0c;回文子串 题目链接&#xff1a;LCR 020. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 【问题描述】 求一个字符串中有多少个回文子串&#xff0c;其中一个字符也算是一个回文子串。 【解法】 动态规划 求一个字符串中回文子串的个数&#xff0c;我么可…

My first day in QT programming

My first QT code this->setWindowTitle("HelloWorld"); //设置窗口名称 this->resize(400, 300); //设置窗口大小 QPushButton* btn new QPushButton; //新建按钮组件 btn->setParent(this); //为按钮指定父对象 …

基于python开发的邮箱合并群发工具

智能邮件群发系统 一个基于Python和PyQt5开发的智能邮件群发工具&#xff0c;支持Word模板和Excel数据源的自动匹配&#xff0c;具有现代化UI界面和友好的用户体验。 Github项目地址&#xff1a;https://github.com/liugang926/Auto-mail-sent.git dist目录有编译好的exe程序&…

大模型-提示词(Prompt)技巧

1、什么是提示词&#xff1f; 提示词&#xff08;Prompt&#xff09;是用户发送给大语言模型的问题、指令或请求&#xff0c;用来明确地告诉模型用户想要解决的问题或完成的任务&#xff0c;是大语言模型理解用户需求并据此生成相关、准确回答或内容的基础。对于大语言模型来说…

Android开发:support.v4包与AndroidX

Android中的support.v4包与AndroidX support.v4包概述 Android Support Library中的android.support.v4包是Google为保持Android应用向后兼容而提供的重要支持库集合。它主要解决以下问题&#xff1a; API版本兼容&#xff1a;让新版API能在旧版Android系统上使用功能增强&a…

TCP-IP模型

书接上回&#xff08;OSI通信模型&#xff09; TCP-IP协议结构 &#xff08;略讲&#xff09; ARP&#xff1a;IP-->MAC RARP&#xff1a;MAC-->IP ICMP&#xff1a;控制报文信息协议&#xff0c;主要是涉及到主机就去连接路由器时控制传输报文&#xff08…