目录
- 小程随笔
- Spring ORM
-
- 作用
- 主要组件
- 示例
-
- HibernateTemplate
- JpaTemplate
- 总结
- 优缺点
-
- 优点
- 缺点
- 总结
- Spring Transaction
-
- 1. 概述
- 2. 传播行为(Propagation)
- 3. 隔离级别
-
- 4. 回滚规则
- 5. 事务配置方式
- 6. 事务管理器
- 7. 常见的事务问题与最佳实践
- 总结
小程随笔
齐善鸿老师说过:你遇到的每一个人,不管如何对待你,不管是好还是坏,他一定在走进你生命的范围和视野,来完成他对你的使命,你以为他是人吗,你也可以把他当作神灵
我想表达的是:把身边的人当成神来看待,是侮辱你,是轻慢你,其实这正是来让我们开启生命的
读者反馈 浅显文章,是我初步学习对sping的理解,处处推敲,搜索考证,希望能对大家有所帮助
Spring ORM
Spring ORM(Object-Relational Mapping)提供了一个抽象层,用于简化与各种对象关系映射(ORM)框架的集成,比如Hibernate、JPA(Java Persistence API)和MyBatis等。
作用
-
集成多种ORM框架:
- Spring ORM模块支持Hibernate、JPA (Java Persistence API)、iBatis等主流的ORM框架,使得开发者可以根据项目需求选择最适合的持久化技术。
- 它通过提供模板类和异常转换等功能,使得这些ORM框架的使用更加简便和统一。
-
事务管理:
- Spring ORM集成了Spring的事务管理功能,可以方便地实现声明式事务管理。这意味着可以通过简单的注解配置来控制事务的开始、提交或回滚,而无需在业务逻辑代码中编写大量的事务管理代码。
- 这不仅提高了代码的可读性和可维护性,也减少了出错的可能性。
-
异常转换:
- Spring ORM将不同ORM框架抛出的特定异常转换为Spring的DataAccessException层次结构下的异常。这样做可以减少因为使用不同的ORM框架而导致的异常处理代码的差异,使得异常处理更加一致和简单。
-
简化数据访问:
- 提供了如
JpaTemplate
、HibernateTemplate
等模板类,这些模板类封装了大量常见的数据访问操作,如查询、保存、更新、删除等,从而减少了样板代码的数量,提高了开发效率。 - 模板类还提供了回调接口,允许执行更复杂的数据库操作,同时仍然享受Spring提供的资源管理和错误处理服务。
- 提供了如
-
支持依赖注入:
- 通过Spring的依赖注入特性,ORM相关的组件(如SessionFactory、EntityManagerFactory等)可以以声明的方式轻松地注入到需要它们的Bean中,这有助于提高代码的解耦性和复用性。
Spring ORM模块通过提供一系列强大的工具和服务,极大地简化了Java应用程序中ORM的使用,使得开发者能够更加专注于业务逻辑的实现,而不是底层的数据访问细节。
主要组件
-
Hibernate:
- Spring ORM 模块提供了对 Hibernate 的支持,通过
LocalSessionFactoryBean
和HibernateTemplate
类,可以方便地配置和使用 Hibernate。 LocalSessionFactoryBean
是一个工厂 Bean,用于创建和配置SessionFactory
,它是 Hibernate 中用来创建Session
对象的关键接口。HibernateTemplate
提供了处理 Hibernate 会话、事务和异常转换的便利方法。尽管在较新的版本中,官方更推荐直接使用@Transactional
注解来管理事务。
- Spring ORM 模块提供了对 Hibernate 的支持,通过
-
JPA (Java Persistence API):
- Spring ORM 支持 JPA 规范,允许开发者使用任何实现了 JPA 的 ORM 框架,如 EclipseLink 或 Hibernate。
- 通过
LocalContainerEntityManagerFactoryBean
可以配置EntityManagerFactory
,这是 JPA 的核心接口之一,用于获取EntityManager
实例。 JpaTemplate
类提供了对 JPA 操作的支持,不过类似于HibernateTemplate
,在现代应用中直接使用EntityManager
结合@Transactional
更为常见。
-
iBatis (MyBatis):
- 虽然 iBatis 已经演进成为 MyBatis,但 Spring 仍然支持通过
SqlMapClientFactoryBean
配置 iBatis 的SqlMapClient
,以及使用SqlMapClientTemplate
进行数据库操作。 SqlMapClient
是 MyBatis 中用于执行 SQL 语句的主要接口,而SqlMapClientTemplate
则提供了一些额外的便利方法来简化数据库操作。
- 虽然 iBatis 已经演进成为 MyBatis,但 Spring 仍然支持通过
-
JDO (Java Data Objects):
- Spring ORM 也支持 JDO,通过
PersistenceManagerFactoryBean
配置PersistenceManagerFactory
,并使用JdoTemplate
进行数据访问。 PersistenceManagerFactory
是 JDO 中用于创建PersistenceManager
的工厂,后者负责对象的持久化和查询。
- Spring ORM 也支持 JDO,通过
这些组件和用于事务管理、异常转换、资源管理等
总的来说,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,开发团队可以专注于业务逻辑的实现,而不是底层的数据访问细节。
优缺点
优点
-
简化配置:Spring ORM通过提供模板类(如
JpaTemplate
、HibernateTemplate
)来简化了ORM框架的配置和使用,减少了开发者需要编写的代码量。 -
事务管理:Spring框架提供了一种声明式事务管理的方式,可以非常方便地将事务管理逻辑与业务逻辑分离,使得事务处理变得更加简单和透明。
-
异常转换:Spring ORM能够将特定于ORM框架的异常转换为Spring的数据访问异常体系,这些异常是非检查型的,这有助于减少异常处理的代码量,并且提高了代码的可读性和可维护性。
-
支持多种ORM框架:Spring ORM不仅支持Hibernate,还支持JPA、iBatis等其他ORM框架,为开发者提供了更多的选择。
-
集成测试支持:Spring框架提供了强大的测试支持,包括模拟数据库操作的能力,这对于单元测试和集成测试非常有帮助。
缺点
-
学习曲线:对于我这种初学者来说,深入理解和熟练掌握Spring ORM以及它所支持的各种ORM框架可能需要一定的时间。
-
性能开销:虽然Spring ORM提供了一些便利的功能,但是这些功能可能会带来一定的性能开销,尤其是在使用模板类进行大量数据库操作时。
-
过度封装:有时候,Spring ORM的过度封装可能会隐藏掉底层ORM框架的一些高级特性,使得开发者难以直接利用这些特性,从而限制了应用的灵活性。
-
配置复杂性:尽管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支持通过异常类型来控制事务回滚:
- 默认情况下,RuntimeException和Error会导致事务回滚,而Checked Exception不会。
- 可以通过
@Transactional
注解的rollbackFor
和noRollbackFor
属性显式指定哪些异常应该或不应该引发事务回滚。
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. 常见的事务问题与最佳实践
- 事务嵌套和传播问题:需要谨慎选择传播行为,以避免事务嵌套导致的复杂性和异常。
- 事务超时设置:通过
@Transactional
的timeout
属性,避免长时间占用数据库连接。 - 只读事务:对于只执行查询操作的事务,可以设置
@Transactional(readOnly = true)
来优化性能。 - 避免在事务中执行长时间操作:事务应尽量简短,避免耗时操作(如文件I/O)影响事务性能。
总结
Spring Transaction模块通过声明式事务管理简化了事务处理,同时提供了灵活的传播行为和隔离级别配置,适用于各种场景的事务需求。合理利用这些特性可以确保数据的完整性和应用的稳定性。