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

发布于:2024-11-29 ⋅ 阅读:(10) ⋅ 点赞:(0)
目录

在这里插入图片描述

小程随笔

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

读者反馈 浅显文章,是我初步学习对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);
    }

    @Transactional
    public 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);
    }

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