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

在现代 Java 开发中,XML 仍然是数据存储和数据交换的重要格式,特别是在 Web 服务、配置管理和数据持久化等场景中。Spring 框架提供了 Spring-OXM(Object/XML Mapping) 模块,旨在简化 Java 对象与 XML 之间的转换,并支持多种 OXM 实现,如 JAXB、Castor、XStream、JibX 等。> > 本篇文章深入解析了 Spring-OXM 模块的核心概念,并结合 JAXB 进行详细示例,展示如何在 Spring 项目中实现 Java 对象与 XML 的双向转换。同时,我们也探讨了 Spring-OXM 与 MyBatis 的关系,说明了在 MyBatis 场景下通常不需要引入 spring-oxm 模块。> > 无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解 Spring-OXM,并在实际开发中灵活运用 XML 映射技术。* * #### 文章目录 * * [1、Spring-Oxm 模块介绍](#1、Spring-Oxm 模块介绍) * * [1.1、Spring-Oxm 模块概述](#1.1、Spring-Oxm 模块概述) * [1.2、Spring-Oxm 模块依赖](#1.2、Spring-Oxm 模块依赖) * [1.3、Spring-Oxm 模块作用](#1.3、Spring-Oxm 模块作用) * [1.4、Spring-Oxm 模块 不适用于 MyBatis](#1.4、Spring-Oxm 模块 不适用于 MyBatis) * [2、Spring oxm 集成 JAXB 并进行数据库操作的示例](#2、Spring oxm 集成 JAXB 并进行数据库操作的示例) * * 2.1、添加依赖 * [2.2、创建 Java 领域对象(Entity)](#2.2、创建 Java 领域对象(Entity)) * [2.3、 配置 Spring-OXM(`oxm-config.xml`)](#2.3、 配置 Spring-OXM(oxm-config.xml)) * [2.4、创建 OXM Service](#2.4、创建 OXM Service) * [2.5、测试 JAXB 序列化/反序列化](#2.5、测试 JAXB 序列化/反序列化) * 2.6、运行后输出 * X、后记* * #### 1、Spring-Oxm 模块介绍##### 1.1、Spring-Oxm 模块概述Spring OXM 模块,是一个关注于对象|XML 映射(Object|XML Mapping)的模块,它支持多种 OXM 实现,比如 JAXB、Castor、XMLBeans 等。这Spring OXM 模块使得在 Spring 应用中处理XML数据变得容易,特别是当需要将 Java 对象转换为 XML 或者从 XML 反序列化为 Java 对象时。通过提供统一的 API,开发者可以灵活选择最适合他们应用场景的 OXM 技术。##### 1.2、Spring-Oxm 模块依赖Spring-Tx 模块的依赖有两个,分别是 Spring-Beans 模块和 Spring-Core 模块。其中 Spring Beans 模块是对 Spring Bean 进行定义,实现 IOC 基础功能的模块。而 Spring-Core 是 Spring 中的基础模块,它提供了框架运行所必需的核心功能。##### 1.3、Spring-Oxm 模块作用spring-oxm(Spring Object/XML Mapping)是 Spring 提供的用于 对象-XML 映射 的模块,主要用于: 统一封装不同的 XML 解析工具(如 JAXB、Castor、XStream、JibX 等)。* 在 Web 服务(如 Spring Web Services)或 XML 处理场景中使用。* 主要用于 OXM(Object-to-XML Mapping)相关的功能。##### 1.4、Spring-Oxm 模块 不适用于 MyBatis在 Spring 集成 MyBatis 时 通常不需要 引入 spring-oxm 模块。MyBatis 主要是 SQL 映射框架,而不是 XML 解析框架:* MyBatis 的 XML 配置文件(mybatis-config.xmlmapper.xml)是 基于标准 XML 解析 的,MyBatis 自身使用 JAXP 解析 XML,无需 spring-oxm。* MyBatis 也支持 纯 Java 配置(基于 @Mapper 注解),这完全不涉及 XML 解析。* * #### 2、Spring oxm 集成 JAXB 并进行数据库操作的示例下面是一个 Spring-OXM 集成 JAXB 的示例,展示如何使用 spring-oxm 将 Java 对象转换为 XML(Marshalling)以及从 XML 转换回 Java 对象(Unmarshalling)。##### 2.1、添加依赖添加以下 Maven 依赖: org.springframework spring-oxm 5.3.39 jakarta.xml.bind jakarta.xml.bind-api 4.0.0 org.glassfish.jaxb jaxb-runtime 4.0.3 ##### 2.2、创建 Java 领域对象(Entity)这里我们定义一个简单的 Person 类,并使用 JAXB 注解进行 XML 绑定。 import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "person") // 指定 XML 根元素 public class Person { private String name; private int age; public Person() {} public Person(String name, int age) { this.name = name; this.age = age; } @XmlElement // 指定 XML 元素 public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } ##### 2.3、 配置 Spring-OXM(oxm-config.xml)在 resources 目录下创建 oxm-config.xml,配置 Jaxb2Marshaller 作为 Spring-OXM 处理器。 <?xml version="1.0" encoding="UTF-8"?> com.example.model.Person ##### 2.4、创建 OXM Service定义 XmlService,使用 Jaxb2Marshaller 进行 XML 序列化和反序列化。 import org.springframework.oxm.jaxb.Jaxb2Marshaller; import java.io. ; public class XmlService { private final Jaxb2Marshaller marshaller; public XmlService(Jaxb2Marshaller marshaller) { this.marshaller = marshaller; } // Java 对象 -> XML public void convertObjectToXml(Object object, String filePath) throws IOException { try (FileOutputStream os = new FileOutputStream(filePath)) { marshaller.marshal(object, new StreamResult(os)); } } // XML -> Java 对象 public T convertXmlToObject(String filePath, Class clazz) throws IOException { try (FileInputStream is = new FileInputStream(filePath)) { return (T) marshaller.unmarshal(new StreamSource(is)); } } } ##### 2.5、测试 JAXB 序列化/反序列化创建 Main 方法来测试 XML 处理功能。 import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; public class Main { public static void main(String\[\] args) { // 加载 Spring XML 配置 ApplicationContext context = new ClassPathXmlApplicationContext("oxm-config.xml"); // 获取 Jaxb2Marshaller Bean Jaxb2Marshaller marshaller = (Jaxb2Marshaller) context.getBean("jaxb2Marshaller"); // 创建 XmlService XmlService xmlService = new XmlService(marshaller); // 创建 Person 对象 Person person = new Person("张三", 30); String filePath = "person.xml"; try { // 1. Java 对象转换为 XML xmlService.convertObjectToXml(person, filePath); System.out.println("XML 文件生成成功:" + filePath); // 2. XML 解析回 Java 对象 Person parsedPerson = xmlService.convertXmlToObject(filePath, Person.class); System.out.println("从 XML 解析的对象:" + parsedPerson); } catch (IOException e) { e.printStackTrace(); } } } ##### 2.6、运行后输出运行 Main 方法后,person.xml 文件内容如下: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 张三 30 控制台输出: XML 文件生成成功:person.xml 从 XML 解析的对象:Person{name='张三', age=30} * * #### X、后记通过本篇文章,我们全面解析了 Spring-OXM 模块的核心功能,并基于 JAXB 提供了完整的示例,帮助大家理解如何在 Spring 应用中高效地进行 XML 处理。在实际项目中,选择合适的 OXM 方案非常重要: 如果你需要 Java 对象与 XML 之间的转换,spring-oxm 结合 JAXB 是一个不错的选择。* 如果你的项目涉及 SQL 交互,那么 MyBatis 更适合数据访问,而无需 spring-oxm。* 如果你的需求更加复杂(如 WebService、数据同步),可以结合 JAXB、XStream、Jackson 等技术灵活选择。希望这篇文章能帮助你掌握 Spring-OXM,并在日常开发中提升你的 XML 处理能力。如果你有更深入的问题或实践经验,欢迎交流探讨! ??

相关推荐
海兰26 分钟前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(二)
javascript·python·金融
nangonghen35 分钟前
Agent如何传递不同类型的ID给MCP Server
开发语言·python
HanhahnaH35 分钟前
垂直分库和水平分库分别解决了什么问题
数据库
weixin_3988316639 分钟前
佛山AI推广GEO哪家做的专业
人工智能·python
吠品40 分钟前
SQL Server 版本查询的几种实用方法
数据库·网络协议·ssl
taller_20001 小时前
【006】何时用 Python?何时用 Excel 公式?一文讲清
python·excel·公式·pie·py
Omics Pro1 小时前
整合多组学分析+生物医学发现!对话式多智能体AI
数据库·人工智能·mysql·机器学习·自然语言处理
严同学正在努力1 小时前
Oracle Data Guard 容灾实战:从搭建到切换,一篇讲透
数据库·ai·oracle
oradh1 小时前
Oracle CTAS+rename 表重建方法操作总结
数据库·oracle·ctas·oracle表重建方法