O/X Mapper 是什么?

Spring 3.0 的一个新特性是 O/X Mapper。O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML。它的目的是在 Java 对象(几乎总是一个 plain old Java object,或简写为 POJO)和 XML 文档之间来回转换。

例 如,您可能有一个带有几个属性的简单 bean,且您的业务需要将那个 Java 对象转换为一个 XML 文档。Spring 的 O/X Mapper 能够为您解决那个问题。如果反过来,您需要将一个 XML 文档转换为一个简单 Java bean,Spring 的 O/X Mapper 也能胜任。

有一点需要注意:Spring O/X Mapper 只是定义由流行的第三方框架实现的统一的界面。要利用 Spring 的 O/X 功能,您需要一个在 Java 对象和 XML 之间来回转换的实用程序。Castor 就是这样一个流行的第三方工具,本文将使用这个工具。其他这样的工具包括 XMLBeans、Java Architecture for XML Binding (JAXB)、JiBX 和 XStream。

编组和解组

进行 O/X 映射时,您经常会看到编组(marshalling)和解组(unmarshalling) 这两个术语。

编组 指将 Java bean 转换成 XML 文档的过程,这意味着 Java bean 的所有字段和字段值都将作为 XML 元素或属性填充到 XML 文件中。有时,编组也称为序列化(serializing)。

如您所料,解组 是与编组完全相反的过程,即将 XML 文档转换为 Java bean,这意味着 XML 文档的所有元素或属性都作为 Java 字段填充到 Java bean 中。有时,解组也称为反序列化(deserializing)。

使用 Spring 的 O/X Mapper 的好处

使 用 Spring 的 O/X Mapper 的一个最直接的好处是可以通过利用 Spring 框架的其他特性简化配置。Spring 的 bean 库支持将实例化的 O/X 编组器注入(即前面提到过的 “依赖项注入”)使用那些编组器的对象。重申一遍,这将加快应用程序开发和部署。

遵循坚实的面向对象的设计实践,Spring O/X 框架只定义两个接口:Marshaller 和 Unmarshaller,它们用于执行 O/X 功能,这是使用这个框架的另一个重大好处。这些接口的实现完全对独立开发人员开放,开发人员可以轻松切换它们而无需修改代码。例如,如果您一开始使用 Castor 进行 O/X 转换,但后来发现它缺乏您需要的某个功能,这时您可以切换到 XMLBeans 而无需任何代码更改。唯一需要做的就是更改 Spring 配置文件以使用新的 O/X 框架。

使用 Spring 的 O/X Mapper 的另一个好处是统一的异常层次结构。Spring 框架遵循使用它的数据访问模块建立的模式,方法是将原始异常对象包装到 Spring 自身专为 O/X Mapper 建立的运行时异常中。由于第三方提供商抛出的原始异常被包装到 Spring 运行时异常中,您能够查明出现异常的根本原因。您也不必费心修改代码以捕获异常,因为异常已包装到一个运行时异常中。以下几个运行时异常扩展了基础异常 XMLMappingException:GenericMarshallingFailureException、 ValidationFailureException、MarshallingFailureException 和 UnmarshallingFailureException。

入门栗子

配置清单:

applicationContext.xml Spring配置文件

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

编组和解组时,套用的mapping格式,在进行解组的时候,必须使用mapping才能成功(这里存在疑问,不知道是否因为自己写法问题,只能通过mapping进行格式编码才能进行解组,否则报出无法找到root element的错误)。

mapping.xml文件

自定义Bean文件

Customer.java

package com.mdf.springoxm;

public class Customer {

private String name;

private String sex;

private Boolean flag;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public Boolean getFlag() {

return flag;

}

public void setFlag(Boolean flag) {

this.flag = flag;

}

}

xmlDemo.java文件

package com.mdf.springoxm;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import javax.xml.transform.stream.StreamResult;

import javax.xml.transform.stream.StreamSource;

import org.springframework.oxm.Marshaller;

import org.springframework.oxm.Unmarshaller;

public class oxmDemo{

private Marshaller marshaller;

private Unmarshaller unmarshaller;

public Marshaller getMarshaller() {

return marshaller;

}

public void setMarshaller(Marshaller marshaller) {

this.marshaller = marshaller;

}

public Unmarshaller getUnmarshaller() {

return unmarshaller;

}

public void setUnmarshaller(Unmarshaller unmarshaller) {

this.unmarshaller = unmarshaller;

}

public void convertFromObjectToXML(Object object, String filepath)

throws IOException {

FileOutputStream os = null;

try {

os = new FileOutputStream(filepath);

getMarshaller().marshal(object, new StreamResult(os));

} finally {

if (os != null) {

os.close();

}

}

}

public Object convertFromXMLToObject(String xmlfile) throws IOException {

FileInputStream is = null;

try {

is = new FileInputStream(xmlfile);

return getUnmarshaller().unmarshal(new StreamSource(is));

} finally {

if (is != null) {

is.close();

}

}

}

}

测试

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mdf.springoxm.Customer;

import com.mdf.springoxm.oxmDemo;

import java.io.IOException;

public class Main {

private static final String XML_FILE_NAME = "customer.xml";

public static void main(String[] args) throws IOException {

ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");

oxmDemo converter = (oxmDemo) appContext.getBean("oxmDemo");

Customer customer = new Customer();

customer.setName("yiibai");

customer.setFlag(true);

customer.setSex("Haikou haidiandao");

System.out.println("Convert Object to XML!");

//from object to XML file

converter.convertFromObjectToXML(customer, XML_FILE_NAME);

System.out.println("Done \n");

System.out.println("Convert XML back to Object!");

//from XML to object

Customer customer2 = (Customer)converter.convertFromXMLToObject(XML_FILE_NAME);

System.out.println(customer2);

System.out.println("Done");

}

}

测试结果:

五月 11, 2016 2:27:52 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1221be2: startup date [Wed May 11 14:27:51 CST 2016]; root of context hierarchy

五月 11, 2016 2:27:52 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [applicationContext.xml]

五月 11, 2016 2:27:52 下午 org.springframework.oxm.castor.CastorMarshaller afterPropertiesSet

信息: Configured using [class path resource [mapping.xml]]

Convert Object to XML!

Done

Convert XML back to Object!

com.mdf.springoxm.Customer@b419da

Done

java oxm_OXM - csnmd - 博客园相关推荐

  1. java课程设计 博客园_Java课程设计博客(团队)

    Java课程设计博客(团队) 1. 团队/项目名称 使用JAVA实现简易HTTP服务器 2. 团队成员 组长:林一心 组员:张杭镖 3. 项目git地址 4. 项目git提交记录截图 5. 项目功能架 ...

  2. 触发器和java的关系_触发器-1 - java ee spring - 博客园

    ------------------------------------环境代码 create  table student (stuid varchar2(10) not null, stuname ...

  3. java课程设计 博客园_java课程设计

    Java程序设计 课程设计 3.本人负责的主要功能展示与代码分析 //这是一个文件夹类 public class Folder { private String name;//文件夹的名称 priva ...

  4. java bag_Java - T---bag - 博客园

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表 ...

  5. java orm框架 博客园_ORM框架的前世今生

    目录 一.ORM简介 二.ORM的工作原理 三.ORM的优缺点 四.常见的ORM框架 一.ORM简介 ORM(Object Relational Mapping)对象关系映射,一般指持久化数据和实体对 ...

  6. java orm框架 博客园_自己写ORM框架 DBUtils

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  7. java mysql 删除 博客园_mysql的增删改查

    增: 新增记录(部分字段):insert into table (字段1,字段2--) values(value1,value2,--) 新增记录(全部字段):insert into table  v ...

  8. java 网络编程 博客园_java网络编程

    1.计算机网络基础 OSI参考模型(开放系统互连参考模型): 物理层:物理层处于OSI的最底层,是整个开放系统的基础.物理层涉及通信信道上传输的原始比特流(bits),它的功能主要是为数据端设备提供传 ...

  9. java接口自动化+博客园_java+接口自动化+eclipse之-----环境搭建

    根据金字塔的比重总结,UI测试占用10%,接口测试占有20%,单元测试占用70%.考虑到之前学过一段时间的单元测试.UI测试,而接口测试未曾接触过,所以最近打算看看接口测试是怎么实现的. 首先,我们先 ...

最新文章

  1. UVa1588 - Kickdown
  2. all controls within the same view will share the same data Model
  3. OpenShift上的无痛集装箱化JBoss通用贷款处理
  4. 关于加域后win7、win8的C:\不能够新建文件,报0X0070522错误的解决方式
  5. python编写鸡兔同笼程序设计_Python少儿编程:鸡兔同笼,涨知识了
  6. 小西笔划输入法 一款可以让你像打五笔那样打笔划输入法的
  7. 和张哥的那些天,互联网人的潜规则
  8. docx文档文字怎么加边框_word给正文加边框 word怎样给一段文字加上边框
  9. linux操作系统中ssh的默认端口号,sshd服务的默认端口号
  10. 移动营业厅前台设备如何安装+新手引导
  11. 攻防世界题库logmein
  12. 【Matlab三维路径规划】狼群算法算法三维路径规划【含源码 167期】
  13. excel表格内文字怎么换行_Excel单元格内如何换行,这几招快拿小本本记下来
  14. 儿童使用计算机和手机的 危害,孩子长期玩手机危害有哪些?
  15. 基于Python的贝壳某城市二手房交易分析及预测系统 文档+项目源码+演示视频
  16. python计算机视觉--基于(BOW)的图像检索与识别
  17. SwitchHosts 模拟本地域名解析访问
  18. JavaScript编程实用方法参考
  19. PLSQL连接 ORACLE11g详解
  20. c语言编写的鼠标键盘录制程序,用C语言写的鼠标驱动程序

热门文章

  1. 360手机用鸿蒙系统,真正意义上的国产操作系统来了,360宣布率先适配华为鸿蒙系统...
  2. 运维网关系列4:Qin Admin
  3. 【第十一届“泰迪杯”数据挖掘挑战赛】B题产品订单的数据分析与需求预测“解题思路“”以及“代码分享”
  4. 计算机学院类脑计算,类脑计算丨CNCC技术论坛
  5. Spring实战 | 番外篇: 搭建Spring环境实现helloworld、Bean配置、Spring容器
  6. 千年虎丘:用文物数字化的方式定格岁月
  7. IOS 调用微信扫码二维码
  8. 老男孩python第九期_python学习之老男孩python全栈第九期_day009作业
  9. 苹果手机用计算机变魔术,iPhone计算器魔术 iPhone计算器隐藏功能
  10. Vue制作静态页面--Day03