欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > Spring 核心技术解析【纯干货版】- X:Spring 数据访问模块 Spring-Orm 模块精讲

Spring 核心技术解析【纯干货版】- X:Spring 数据访问模块 Spring-Orm 模块精讲

2025/2/7 15:24:30 来源:https://blog.csdn.net/weixin_45187434/article/details/145477302  浏览:    关键词:Spring 核心技术解析【纯干货版】- X:Spring 数据访问模块 Spring-Orm 模块精讲

在现代 Java 企业级开发中,对象关系映射(ORM)已成为处理数据库操作的主流方式。Spring ORM 模块作为 Spring 框架的重要组成部分,为开发者提供了便捷、高效的 ORM 框架集成方案。它不仅支持 Hibernate、JPA 等主流 ORM 框架,还提供了统一的事务管理、异常转换和数据源管理,使数据库操作更加简单和规范。

本篇文章深入解析了 Spring ORM 的核心概念、依赖关系、作用及应用场景,并通过详细的示例展示了如何集成 Hibernate 进行数据库操作。无论你是刚接触 Spring ORM 的初学者,还是希望深入优化数据访问层的开发者,都可以从本篇文章中获得实用的技术指导。


文章目录

      • 1、Spring-Orm 模块介绍
        • 1.1、Spring-Orm 模块概述
        • 1.2、Spring-Orm 模块依赖
        • 1.3、Spring-Orm 模块作用
      • 2、Spring ORM 集成 Hibernate 并进行数据库操作的示例
        • 2.1、项目环境
        • 2.2、引入 Maven 依赖
        • 2.3、配置 Hibernate 的 SessionFactory
        • 2.4、定义实体类
        • 2.5、创建 DAO(数据访问对象)
        • 2.6、创建 Service 业务层
        • 2.7、测试 Service
        • 2.8、Spring ORM 在此示例中的作用
      • 3、使用 Spring-Orm 常见问题与解决方案
        • 3.1、N+1 问题
        • 3.2、事务失效
      • X、后记


1、Spring-Orm 模块介绍

1.1、Spring-Orm 模块概述

Spring-ORM 模块,是一个致力于整合对象关系映射(ORM)技术的模块,特别 适用于与 Hibernate、JPA(Java Persistence API)等流行 的ORM 框架的集成。

Spring-ORM 模块提供了 SessionFactory 的配置、事务管理以及对实体类的生命周期管理等功能,使得在 Spring 应用中使用 ORM 工具变得更加简单和高效。通过 Spring-ORM,可以利用 Spring 的事务管理能力的同时享受 ORM 框架带来的对象关系映射便利。

1.2、Spring-Orm 模块依赖

Spring-Tx 模块的依赖有四个,分别是 Spring-Beans、Spring-Core 模块、Spring-Tx 模块 和 Spirng-Jdbc 模块。

其中 Spring Beans 模块是对 Spring Bean 进行定义,实现 IOC 基础功能的模块。Spring-Core 是 Spring 中的基础模块,它提供了框架运行所必需的核心功能。而 Spring Tx 模块,是 Spring 中处理事务管理的模块。

Spring JDBC 模块,是一个提供了对 JDBC 访问的高度抽象的模块,它简化了使用 JDBC 进行数据库操作的过程。

1.3、Spring-Orm 模块作用

Spring ORM(Object-Relational Mapping)模块的作用是简化对象与关系型数据库之间的映射和交互。它为开发者提供了一种更高效、灵活的方式来处理数据库操作,支持多个主流的 ORM 框架,比如 Hibernate、JPA、JDO 等。

具体功能包括:

  1. 集成 ORM 框架:Spring ORM 模块能够与多种 ORM 框架(如 Hibernate、JPA)无缝集成,简化配置过程,减少开发者的手动配置工作。
  2. 事务管理:Spring ORM 提供统一的事务管理机制,可以通过 Spring 的声明式事务管理来简化事务的控制,减少复杂的事务处理代码。
  3. 异常转换:Spring ORM 会将 ORM 框架抛出的特定异常(如 HibernateException)转换为 Spring 的统一数据访问异常(如 DataAccessException),使异常处理变得更简洁且跨框架兼容。
  4. 数据源管理:Spring ORM 提供了灵活的数据源管理方式,可以轻松管理数据库连接和资源,支持多种数据源和数据库连接池的配置。
  5. 简化配置:通过 Spring 的依赖注入(DI)和面向切面编程(AOP),Spring ORM 可以简化 ORM 框架的配置和事务管理。

2、Spring ORM 集成 Hibernate 并进行数据库操作的示例

2.1、项目环境
  • Spring Framework 5.x / 6.x
  • Hibernate 5.x / 6.x
  • Spring ORM
  • MySQL / H2 数据库
  • Maven
2.2、引入 Maven 依赖
    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.39</version></dependency><!-- Spring ORM --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>5.3.39</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.39</version></dependency><!-- Hibernate Core --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.6.15.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies>
2.3、配置 Hibernate 的 SessionFactory
import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;import javax.sql.DataSource;
import java.util.Properties;@Configuration
public class HibernateConfig {@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC");dataSource.setUsername("root");dataSource.setPassword("password");return dataSource;}@Beanpublic LocalSessionFactoryBean sessionFactory() {LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();sessionFactory.setDataSource(dataSource());sessionFactory.setPackagesToScan("com.example.model"); // 实体类所在包sessionFactory.setHibernateProperties(hibernateProperties());return sessionFactory;}private Properties hibernateProperties() {Properties properties = new Properties();properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");properties.put("hibernate.hbm2ddl.auto", "update"); // 自动更新表结构properties.put("hibernate.show_sql", "true"); // 控制台显示 SQL 语句return properties;}@Beanpublic HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {return new HibernateTransactionManager(sessionFactory);}
}
2.4、定义实体类
import jakarta.persistence.*;@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "name")private String name;@Column(name = "email")private String email;public User() {}public User(String name, String email) {this.name = name;this.email = email;}// Getters and Setters
}
2.5、创建 DAO(数据访问对象)
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;@Repository
public class UserDao {@Autowiredprivate SessionFactory sessionFactory;public void saveUser(User user) {Session session = sessionFactory.getCurrentSession();session.save(user);}public User getUserById(Long id) {Session session = sessionFactory.getCurrentSession();return session.get(User.class, id);}public List<User> getAllUsers() {Session session = sessionFactory.getCurrentSession();return session.createQuery("from User", User.class).list();}
}
2.6、创建 Service 业务层
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;@Service
@Transactional
public class UserService {@Autowiredprivate UserDao userDao;public void createUser(String name, String email) {User user = new User(name, email);userDao.saveUser(user);}public User findUserById(Long id) {return userDao.getUserById(id);}public List<User> getAllUsers() {return userDao.getAllUsers();}
}
2.7、测试 Service
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HibernateConfig.class);UserService userService = context.getBean(UserService.class);// 创建用户userService.createUser("张三", "zhangsan@example.com");// 查询用户User user = userService.findUserById(1L);System.out.println("用户信息:" + user.getName() + ", " + user.getEmail());// 查询所有用户userService.getAllUsers().forEach(u -> System.out.println(u.getName() + " - " + u.getEmail()));context.close();}
}
2.8、Spring ORM 在此示例中的作用

Spring ORM 通过整合 Hibernate,提供了一种简洁、规范的方式来处理数据库操作,减少了 Hibernate 的模板代码,增强事务控制,并且降低了与 Hibernate 的耦合度。如果以后切换到 JPA 或其他 ORM 框架,Spring ORM 依然可以无缝支持。

Spring ORM 在此示例中的作用:

  1. 集成 Hibernate:使用 LocalSessionFactoryBean 作为 Hibernate SessionFactory 的工厂,Spring 通过它管理 Hibernate 的会话。
  2. 事务管理:使用 HibernateTransactionManager 统一管理数据库事务,使 @Transactional 方法中的操作自动开启和提交事务。
  3. 简化 Session 管理:sessionFactory.getCurrentSession() 由 Spring 事务管理自动提供,避免手动开启和关闭 Session
  4. 简化 DAO 层开发:使用 @Repository 使 DAO 组件化,并支持自动注入 SessionFactory,避免繁琐的 Hibernate 配置。
  5. 异常转换:Spring ORM 自动将 Hibernate 的异常转换为 Spring 统一的数据访问异常,使异常处理更一致。

3、使用 Spring-Orm 常见问题与解决方案

3.1、N+1 问题

在使用 ORM 框架时,N+1 问题是一个常见的性能问题。这个问题通常发生在一对多或多对多关联查询时,ORM 框架会发送多条 SQL 语句,导致性能下降。解决 N+1 问题的方式是使用 fetch 策略:

@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;

将关联实体的抓取策略设置为 LAZY(懒加载),避免不必要的关联查询。

3.2、事务失效

在某些情况下,事务可能会失效。常见的原因有:

  • 方法的 @Transactional 注解未生效,因为 Spring 的事务管理依赖于 AOP 代理,因此必须通过 Spring 容器管理的代理对象调用事务方法。
  • 将事务方法标记为 private,Spring AOP 无法拦截 private 方法。

X、后记

Spring ORM 作为 Spring 数据访问层的重要组件,在简化 ORM 框架集成、提高数据库操作效率方面发挥着至关重要的作用。通过本篇文章的介绍,相信你已经掌握了 Spring ORM 的基础概念和基本用法,并了解了如何在实际项目中使用它来管理数据库事务、优化数据访问层的架构。

在实际开发过程中,合理选择 ORM 框架、优化查询性能、避免常见问题(如 N+1 查询、事务失效等)至关重要。希望本篇文章能为你提供有价值的参考,让你在 Spring ORM 的应用和优化之路上更加顺畅!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com