Spring模块详解Ⅴ(Spring ORM Spring Transaction)

news/2024/11/25 13:35:36/
目录
  • 小程随笔
  • Spring ORM
    • 作用
    • 主要组件
    • 示例
      • HibernateTemplate
      • JpaTemplate
    • 总结
    • 优缺点
      • 优点
      • 缺点
    • 总结
  • Spring Transaction
    • 1. 概述
    • 2. 传播行为(Propagation)
    • 3. 隔离级别
      • 4. 回滚规则
    • 5. 事务配置方式
    • 6. 事务管理器
    • 7. 常见的事务问题与最佳实践
    • 总结

在这里插入图片描述

小程随笔

齐善鸿老师说过:你遇到的每一个人,不管如何对待你,不管是好还是坏,他一定在走进你生命的范围和视野,来完成他对你的使命,你以为他是人吗,你也可以把他当作神灵
我想表达的是:把身边的人当成神来看待,是侮辱你,是轻慢你,其实这正是来让我们开启生命的

读者反馈 浅显文章,是我初步学习对sping的理解,处处推敲,搜索考证,希望能对大家有所帮助
ALT
在这里插入图片描述

Spring ORM

Spring ORM(Object-Relational Mapping)提供了一个抽象层,用于简化与各种对象关系映射(ORM)框架的集成,比如Hibernate、JPA(Java Persistence API)和MyBatis等。

作用

  1. 集成多种ORM框架

    • Spring ORM模块支持Hibernate、JPA (Java Persistence API)、iBatis等主流的ORM框架,使得开发者可以根据项目需求选择最适合的持久化技术。
    • 它通过提供模板类和异常转换等功能,使得这些ORM框架的使用更加简便和统一。
  2. 事务管理

    • Spring ORM集成了Spring的事务管理功能,可以方便地实现声明式事务管理。这意味着可以通过简单的注解配置来控制事务的开始、提交或回滚,而无需在业务逻辑代码中编写大量的事务管理代码。
    • 这不仅提高了代码的可读性和可维护性,也减少了出错的可能性。
  3. 异常转换

    • Spring ORM将不同ORM框架抛出的特定异常转换为Spring的DataAccessException层次结构下的异常。这样做可以减少因为使用不同的ORM框架而导致的异常处理代码的差异,使得异常处理更加一致和简单。
  4. 简化数据访问

    • 提供了如JpaTemplateHibernateTemplate等模板类,这些模板类封装了大量常见的数据访问操作,如查询、保存、更新、删除等,从而减少了样板代码的数量,提高了开发效率。
    • 模板类还提供了回调接口,允许执行更复杂的数据库操作,同时仍然享受Spring提供的资源管理和错误处理服务。
  5. 支持依赖注入

    • 通过Spring的依赖注入特性,ORM相关的组件(如SessionFactory、EntityManagerFactory等)可以以声明的方式轻松地注入到需要它们的Bean中,这有助于提高代码的解耦性和复用性。

Spring ORM模块通过提供一系列强大的工具和服务,极大地简化了Java应用程序中ORM的使用,使得开发者能够更加专注于业务逻辑的实现,而不是底层的数据访问细节。

在这里插入图片描述

主要组件

  1. Hibernate

    • Spring ORM 模块提供了对 Hibernate 的支持,通过 LocalSessionFactoryBeanHibernateTemplate 类,可以方便地配置和使用 Hibernate。
    • LocalSessionFactoryBean 是一个工厂 Bean,用于创建和配置 SessionFactory,它是 Hibernate 中用来创建 Session 对象的关键接口。
    • HibernateTemplate 提供了处理 Hibernate 会话、事务和异常转换的便利方法。尽管在较新的版本中,官方更推荐直接使用 @Transactional 注解来管理事务。
  2. JPA (Java Persistence API)

    • Spring ORM 支持 JPA 规范,允许开发者使用任何实现了 JPA 的 ORM 框架,如 EclipseLink 或 Hibernate。
    • 通过 LocalContainerEntityManagerFactoryBean 可以配置 EntityManagerFactory,这是 JPA 的核心接口之一,用于获取 EntityManager 实例。
    • JpaTemplate 类提供了对 JPA 操作的支持,不过类似于 HibernateTemplate,在现代应用中直接使用 EntityManager 结合 @Transactional 更为常见。
  3. iBatis (MyBatis)

    • 虽然 iBatis 已经演进成为 MyBatis,但 Spring 仍然支持通过 SqlMapClientFactoryBean 配置 iBatis 的 SqlMapClient,以及使用 SqlMapClientTemplate 进行数据库操作。
    • SqlMapClient 是 MyBatis 中用于执行 SQL 语句的主要接口,而 SqlMapClientTemplate 则提供了一些额外的便利方法来简化数据库操作。
  4. JDO (Java Data Objects)

    • Spring ORM 也支持 JDO,通过 PersistenceManagerFactoryBean 配置 PersistenceManagerFactory,并使用 JdoTemplate 进行数据访问。
    • PersistenceManagerFactory 是 JDO 中用于创建 PersistenceManager 的工厂,后者负责对象的持久化和查询。

这些组件和用于事务管理、异常转换、资源管理等
总的来说,Spring ORM 模块通过提供一系列的抽象层和工具类,大大简化了 Java 应用程序与多种 ORM 框架的集成工作,提高了开发效率和代码质量。
在这里插入图片描述

示例

HibernateTemplate
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;public class UserDaoImpl implements UserDao {private HibernateTemplate hibernateTemplate;public void setSessionFactory(SessionFactory sessionFactory) {this.hibernateTemplate = new HibernateTemplate(sessionFactory);}@Transactionalpublic User getUserById(Long id) {return hibernateTemplate.get(User.class, id);}
}

UserDaoImpl 类实现了 UserDao 接口,并使用了 HibernateTemplate 来简化与数据库的交互。@Transactional 注解用于开启事务管理。

JpaTemplate
import org.springframework.orm.jpa.JpaTemplate;
import org.springframework.transaction.annotation.Transactional;public class UserDaoImpl implements UserDao {private JpaTemplate jpaTemplate;public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {this.jpaTemplate = new JpaTemplate(entityManagerFactory);}@Transactionalpublic User getUserById(Long id) {return jpaTemplate.find(User.class, id);}
}

UserDaoImpl 类使用 JpaTemplate 进行数据访问操作,同样通过 @Transactional 注解来管理事务。

总结

Spring ORM模块通过提供强大的抽象层,帮助开发者更容易地与不同的ORM工具集成。它不仅简化了数据库操作,还增强了应用程序的可维护性和扩展性。使用Spring ORM,开发团队可以专注于业务逻辑的实现,而不是底层的数据访问细节。
在这里插入图片描述

优缺点

优点
  1. 简化配置:Spring ORM通过提供模板类(如JpaTemplateHibernateTemplate)来简化了ORM框架的配置和使用,减少了开发者需要编写的代码量。

  2. 事务管理:Spring框架提供了一种声明式事务管理的方式,可以非常方便地将事务管理逻辑与业务逻辑分离,使得事务处理变得更加简单和透明。

  3. 异常转换:Spring ORM能够将特定于ORM框架的异常转换为Spring的数据访问异常体系,这些异常是非检查型的,这有助于减少异常处理的代码量,并且提高了代码的可读性和可维护性。

  4. 支持多种ORM框架:Spring ORM不仅支持Hibernate,还支持JPA、iBatis等其他ORM框架,为开发者提供了更多的选择。

  5. 集成测试支持:Spring框架提供了强大的测试支持,包括模拟数据库操作的能力,这对于单元测试和集成测试非常有帮助。

缺点
  1. 学习曲线:对于我这种初学者来说,深入理解和熟练掌握Spring ORM以及它所支持的各种ORM框架可能需要一定的时间。

  2. 性能开销:虽然Spring ORM提供了一些便利的功能,但是这些功能可能会带来一定的性能开销,尤其是在使用模板类进行大量数据库操作时。

  3. 过度封装:有时候,Spring ORM的过度封装可能会隐藏掉底层ORM框架的一些高级特性,使得开发者难以直接利用这些特性,从而限制了应用的灵活性。

  4. 配置复杂性:尽管Spring ORM旨在简化配置,但在某些情况下,特别是当项目规模较大或需求较为复杂时,配置文件可能会变得相当复杂,增加了维护的难度。

总结

Spring ORM为开发者提供了一个强大而灵活的数据访问层解决方案,它在简化开发流程、提高代码质量和可维护性方面具有显著的优势。然而,正如任何技术栈一样,它也有自己的局限性和适用场景,开发者需要根据项目的具体需求来权衡是否采用Spring ORM。
在这里插入图片描述

Spring Transaction

Spring Transaction模块是Spring框架中用于管理事务的关键部分,提供了简便而强大的编程方式来处理数据库事务。事务管理的核心目的是确保数据操作的原子性、一致性、隔离性和持久性(ACID原则)。

1. 概述

Spring提供了两种主要的事务管理方式:

  • 编程式事务管理:通过代码显式管理事务,灵活性高,但代码冗长。
  • 声明式事务管理:使用注解或XML配置来管理事务,是Spring事务管理的主流方式。

声明式事务管理通过AOP(面向切面编程)技术,能够在业务代码外部定义事务规则,降低代码耦合度。

2. 传播行为(Propagation)

  • PROPAGATION_REQUIRED(默认):当前方法必须在事务中运行,如果没有现有事务,就创建一个新的事务。
  • PROPAGATION_SUPPORTS:当前方法可以在事务中运行,但如果没有现有事务,也可以在非事务环境下运行。
  • PROPAGATION_MANDATORY:必须在现有事务中运行,如果没有现有事务,则抛出异常。
  • PROPAGATION_REQUIRES_NEW:每次调用都会启动一个新的事务,旧事务将被挂起。
  • PROPAGATION_NOT_SUPPORTED:当前方法不在事务环境中运行,暂停现有事务。
  • PROPAGATION_NEVER:当前方法不允许在事务环境中运行,否则抛出异常。
  • PROPAGATION_NESTED:支持嵌套事务,即在一个事务中再开启一个子事务。

用于控制一个事务方法如何与现有事务结合
在这里插入图片描述

3. 隔离级别

  • ISOLATION_DEFAULT:使用数据库的默认隔离级别。
  • ISOLATION_READ_UNCOMMITTED:最低隔离级别,可能会导致脏读(dirty read)。
  • ISOLATION_READ_COMMITTED:允许读取已提交的数据,防止脏读。
  • ISOLATION_REPEATABLE_READ:可重复读,防止脏读和不可重复读(non-repeatable read)。
  • ISOLATION_SERIALIZABLE:最高隔离级别,确保事务串行执行,防止所有并发问题。
4. 回滚规则

Spring支持通过异常类型来控制事务回滚:

  • 默认情况下,RuntimeExceptionError会导致事务回滚,而Checked Exception不会。
  • 可以通过@Transactional注解的rollbackFornoRollbackFor属性显式指定哪些异常应该或不应该引发事务回滚。
    在这里插入图片描述

5. 事务配置方式

  • 1.XML配置:传统方式,通过XML文件配置事务管理器和事务属性。

  • 2.注解方式:现代方式,通过@Transactional注解在类或方法上配置事务。示例如下:

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
    public void someTransactionalMethod() {// 业务//逻辑//代码}
    

6. 事务管理器

  • DataSourceTransactionManager:用于JDBC的事务管理。
  • JpaTransactionManager:用于JPA的事务管理。
  • HibernateTransactionManager:用于Hibernate的事务管理。
  • JtaTransactionManager:用于Java EE环境下的分布式事务管理。

不同的管理器:针对不同的数据访问技术

7. 常见的事务问题与最佳实践

  • 事务嵌套和传播问题:需要谨慎选择传播行为,以避免事务嵌套导致的复杂性和异常。
  • 事务超时设置:通过@Transactionaltimeout属性,避免长时间占用数据库连接。
  • 只读事务:对于只执行查询操作的事务,可以设置@Transactional(readOnly = true)来优化性能。
  • 避免在事务中执行长时间操作:事务应尽量简短,避免耗时操作(如文件I/O)影响事务性能。

在这里插入图片描述

总结

Spring Transaction模块通过声明式事务管理简化了事务处理,同时提供了灵活的传播行为和隔离级别配置,适用于各种场景的事务需求。合理利用这些特性可以确保数据的完整性和应用的稳定性。


http://www.ppmy.cn/news/1549831.html

相关文章

基于Gradle搭建Spring6.2.x版本源码阅读环境

前言 阅读源码是程序猿成长的必经一环,正所谓知其然知其所以然。我们在开发成长道路上不仅需要知道如何使用,更要懂得其背后的原理,如此方可得心应手。本篇文章旨在指导大家搭建Spring6.0以上版本的源码阅读环境,方便大家在学习源…

本地部署 MaskGCT

本地部署 MaskGCT 0. 更新系统和安装依赖项1. 克隆代码2. 创建虚拟环境3. 安装依赖模块4. 运行 MaskGCT5. 访问 MaskGCT 0. 更新系统和安装依赖项 sudo apt update sudo apt install espeak-ng1. 克隆代码 git clone https://github.com/engchina/learn-maskgct.git; cd lear…

2. Autogen官网教程 (Terminating Conversations Between Agents)

在这一章中,我们将探讨如何结束自动生成代理之间的对话。 导入必要的库 import osfrom autogen import ConversableAgent配置智能体 我们需要配置智能体使用的语言模型(LLM)。以下是一个配置示例: llm_config {"config_…

初识Linux—— 基本指令(下)

前言: 本篇继续来学习Linux的基础指令,继续加油!!! 本篇文章对于图片即内容详解,已同步到本人gitee:Linux学习: Linux学习与知识讲解 Linux指令 1、查看文件内容的指令 cat ​ cat 查看文件…

【FPGA-MicroBlaze】串口收发以及相关函数讲解

前言 工具:Vivado2018.3及其所对应的SDK版本 目前网上有许多MicroBlaze 的入门教程,比如下面的这个参考文章,用串口打印一个hello world。 【FPGA】Xilinx MicroBlaze软核使用第一节:Hello World!_fpga软核microblaze-CSDN博客 个…

[Redis#0] iredis: linux上redis超好用的环境配置

目录 Features 特征 Install 安装 Pip Brew Linux的 Download Binary 下载 Binary Usage 用法 Using DSN 使用 DSN Change The Default Prompt更改默认提示 Configuration 配置 Keys Development 发展 Release Strategy 发布策略 Setup Environment 设置环境 De…

go-zero(九) 自定义拦截器

go-zero 拦截器 有时我们需要在处理请求的过程中添加一些额外的逻辑,比如身份验证、日志记录、请求限流、性能监控等,这些都可以通过拦截器实现。go zero可以设置多个拦截器 一、 服务端拦截器 服务端拦截器用于处理传入的 RPC 请求,可以在…

操作系统进程和线程——针对实习面试

目录 操作系统进程和线程什么是进程和线程?进程和线程的区别?进程有哪些状态?什么是线程安全?如何实现线程安全?什么是线程安全?如何实现线程安全? 进程间的通信有哪几种方式?什么是…