欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于数据映射 博客分类: Java编程 数据结构XMLJavaEXTJBuilder 

程序员文章站 2024-03-24 10:58:58
...
一个笔记:
1 关于marshal类:(对映射文件的处理)
Marshaller类用来将一个Java类转换为XML数据。UnMarshaller类转换一个XML文档成Java对象。

对映射文件处理的简单例子的代码片断:
Marshaller marshaller;

Mapping _mapping;

PrintWriter writer;

MyClass myObject;

………………

// 创建marshaller对象并载入Mapping映射规则

marshaller = new Marshaller( writer );

marshaller.setMapping( _mapping );





// OO对象到XML数据 (可以是流,DOM树节点,或是SAX遍历句柄)
的映射转换

java.io.Writer out;

marshaller.marshal(myObject, out);





org.w3c.dom.Node node

marshaller.marshal(myObject, node);





org.xml.sax.DocumentHandler handler

marshaller.marshal(myObject, handler);

………………

几个重要概念:

编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。

解组(Unmarshalling)是把数据从存储媒介转换到内存中的过程——正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。

往返(Round-tripping)可能是最重要也最容易误解的数据绑定术语。往返用于描述从存储媒介到内存然后回到存储媒介的完整循环。在 XML 和 Java 技术环境中,这就意味着从 XML 文档到 Java 实例变量,然后再回到 XML 文档。正确的往返要求,如果中间没有修改数据,XML 输入和 XML 输出应该是等同的。

Castor 框架:

Castor XML 数据绑定很容易上手,甚至不需要定义 XML 文档格式。只要您的数据用类 JavaBean 的对象表示,Castor 就能自动生成表示这些数据的文档格式,然后从文档重构原始数据。

用一个例子(Castor)来说明:Jbuilder中调试

This bean was auto generated from a schema

清单 1. XmlEmployeeType信息 bean

package com.borland.samples.xml.databinding.castor;

import java.io.IOException;

import java.io.Reader;

import java.io.Serializable;

import java.io.Writer;

import org.exolab.castor.xml.MarshalException;

import org.exolab.castor.xml.Marshaller;

import org.exolab.castor.xml.Unmarshaller;

import org.exolab.castor.xml.ValidationException;

import org.xml.sax.ContentHandler;

/**

* Class XmlEmployeeType.

* @version $Revision$ $Date$

*/

public class XmlEmployeeType implements java.io.Serializable {

      private java.lang.String _empNo;

      private java.lang.String _firstName;

      private java.lang.String _lastName;

    private java.lang.String _phoneExt;

    private java.lang.String _hireDate;

    private java.lang.String _deptNo;

    private java.lang.String _jobCode;

    private java.lang.String _jobGrade;

    private java.lang.String _jobCountry;

      private java.lang.String _salary;

     private java.lang.String _fullName;

    public XmlEmployeeType() {

        super();

      }

     public java.lang.String getDeptNo()

     {

        return this._deptNo;

      }

      public java.lang.String getEmpNo()

    {

        return this._empNo;

    }

  

    public java.lang.String getFirstName()

    {

        return this._firstName;

    }

  

    public java.lang.String getFullName()

    {

        return this._fullName;

    }

  

    public java.lang.String getHireDate()

    {

        return this._hireDate;

}



    public java.lang.String getJobCode()

    {

        return this._jobCode;

    } tJobCode()



       public java.lang.String getJobCountry()

    {

        return this._jobCountry;

    }

  

    public java.lang.String getJobGrade()

    {

        return this._jobGrade;

    }

  

    public java.lang.String getLastName()

    {

        return this._lastName;

    }

  

    public java.lang.String getPhoneExt()

    {

        return this._phoneExt;

    }

  

    public java.lang.String getSalary()

    {

        return this._salary;

    } //-- java.lang.String getSalary()





    public boolean isValid()

    {

        try {

            validate();

        }

        catch (org.exolab.castor.xml.ValidationException vex) {

            return false;

        }

        return true;

    }

 

    public void marshal(java.io.Writer out)

        throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException

    {

       

        Marshaller.marshal(this, out);

}

 

    public void marshal(org.xml.sax.ContentHandler handler)

        throwsjava.io.IOException,org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException

    {

         Marshaller.marshal(this, handler);

    }

   

    public void setDeptNo(java.lang.String deptNo)

    {

        this._deptNo = deptNo;

    }

    public void setEmpNo(java.lang.String empNo)

    {

        this._empNo = empNo;

    }

    public void setFirstName(java.lang.String firstName)

    {

        this._firstName = firstName;

    } //-- void setFirstName(java.lang.String)





    public void setFullName(java.lang.String fullName)

    {

        this._fullName = fullName;

    } //-- void setFullName(java.lang.String)



  

    public void setHireDate(java.lang.String hireDate)

    {

        this._hireDate = hireDate;

    } //-- void setHireDate(java.lang.String)



  

    public void setJobCode(java.lang.String jobCode)

    {

        this._jobCode = jobCode;

} //-- void setJobCode(java.lang.String)



    public void setJobCountry(java.lang.String jobCountry)

    {

        this._jobCountry = jobCountry;

    } //-- void setJobCountry(java.lang.String)





    public void setJobGrade(java.lang.String jobGrade)

    {

        this._jobGrade = jobGrade;

    } //-- void setJobGrade(java.lang.String)



  

    public void setLastName(java.lang.String lastName)

    {

        this._lastName = lastName;

    } //-- void setLastName(java.lang.String)



 

    public void setPhoneExt(java.lang.String phoneExt)

    {

        this._phoneExt = phoneExt;

    } //-- void setPhoneExt(java.lang.String)



 

    public void setSalary(java.lang.String salary)

    {

        this._salary = salary;

    } //-- void setSalary(java.lang.String)



    public static java.lang.Object unmarshal(java.io.Reader reader)

        throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException

    {

        Return(com.borland.samples.xml.databinding.castor.XmlEmployeeType) Unmarshaller.unmarshal(com.borland.samples.xml.databinding.castor.XmlEmployeeType.class, reader);

    } //-- java.lang.Object unmarshal(java.io.Reader)



   

    public void validate()

        throws org.exolab.castor.xml.ValidationException

    {

        org.exolab.castor.xml.Validator validator = new org.exolab.castor.xml.Validator();

        validator.validate(this);

    } //-- void validate()

}

清单 2. 测试默认的数据绑定

/**

* Title:        XML Tutorial

* Description:  XML Tutorial for JBuilder

* Company:      Borland Software Coporation

* @author

* @version 1.0

*/

import java.io.*;

import org.exolab.castor.xml.*;

public class DB_Castor {

public DB_Castor() {

  }

public static void main(String[] args) {

    try {

       String fileName = "Employees.xml";

       System.out.println("== unmarshalling \"" + fileName + "\" ==");

       //Unmarshal XML file.

       XmlEmployees xmlEmployees = (XmlEmployees)XmlEmployees.unmarshal(new FileReader(fileName));

       System.out.println("TotalNumber of XmlEmployees read = " + xmlEmployees.getXmlEmployeeCount());

       System.out.println("FirstXmlEmployee's Full Name is " + xmlEmployees.getXmlEmployee(0).getFullName());

       System.out.println("LastXmlEmployee's Full Name is " + xmlEmployees.getXmlEmployee(xmlEmployees.getXmlEmployeeCount()-1).getFullName());

       // Add an XmlEmployee.

       xmlEmployees.addXmlEmployee(getXmlEmployee("8000","400","Charlie","Castor","3/3/2001","VP","USA","2","1993","155000.00"));



       // Modify the last XmlEmployee.

       xmlEmployees.setXmlEmployee(xmlEmployees.getXmlEmployeeCount()-1, getXmlEmployee("8000","600","Peter","Castor","3/3/2001","VP","USA","3","2096","125000.00"));



       // Marshal out the data to the same XML file.

       xmlEmployees.marshal(new java.io.FileWriter(fileName));

      }

       catch (Exception ex) {

         ex.printStackTrace();

    }

  }

  private static XmlEmployee getXmlEmployee(String XmlEmployeeNumber,String departmentNumber,String firstName,String lastName,String hireDate,String jobCode,String jobCountry,String jobGrade,String phoneExt,String salary){

    XmlEmployee xmlEmployee = new XmlEmployee();

    xmlEmployee.setEmpNo(XmlEmployeeNumber);

    xmlEmployee.setDeptNo(departmentNumber);

    xmlEmployee.setFirstName(firstName);

    xmlEmployee.setLastName(lastName);

    xmlEmployee.setFullName(lastName+", "+firstName);

    xmlEmployee.setHireDate(hireDate);

    xmlEmployee.setJobCode(jobCode);

    xmlEmployee.setJobCountry(jobCountry);

    xmlEmployee.setJobGrade(jobGrade);

    xmlEmployee.setPhoneExt(phoneExt);

    xmlEmployee.setSalary(salary);

    return xmlEmployee;

  }

}



最后,看看运行的效果;XML是不是变化了;此篇仅仅描述了一个Castor框架,还有JAXB(Sun的框架);以及其他开源的框架需要不断的去学习。

==========================
Castor 学习笔记
Castor XML
http://www.castor.org/xml-framework.html

Castor XML 是XML数据绑定的framework。
与两种主要的XML API(DOM及SAX)不同,它们主要是处理XML文件的结构,
而Castor能够通过表现数据的对象,处理XML文件中的数据。

Castor XML能处理几乎所有java bean格式的java对象,从xml读取或生成xml。
大多数情况下,marshalling框架使用ClassDescriptors和FieldDescriptors来描述
一个对象怎么marshal成xml文件,或从xml文件中unmarshal。
术语marshal 和unmarshal,是表示转换数据流从/到一个对象的行为。
marshalling转换对象到stream,unmarshalling从stream到一个对象。

The marshalling framework
负责执行java和xml之间的转换。
包含两个主要的类:
org.exolab.castor.xml.Marshaller and org.exolab.castor.xml.Unmarshaller.
假设有一个Member类,marshal一个对象,只需要简单的调用Marshaller如下:
Member Member = new Member("Ryan 'Mad Dog' Madden");
writer = new FileWriter("test.xml");
Marshaller.marshal(Member, writer);
unmarshal需要调用Unmarshaller如下:
reader = new FileReader("test.xml");
Member Member = (Member)Unmarshaller.unmarshal(Member.class, reader);
注意:当使用mapping文件时,以上代码是不够的:
Mapping mapping = new Mapping();
mapping.loadMapping("mapping.xml");
reader = new FileReader("test.xml");
Unmarshaller unmarshaller = new Unmarshaller(Member.class);
unmarshaller.setMapping(mapping);
Member Member = (Member)unmarshaller.unmarshal(reader);


Using Existing Classes/Objects
Castor能marshal几乎所有任意的对象从/到xml。
当特殊类的描述不可用时,
marshalling framework使用reflection得到对象的信息。

把描述放在java 源文件中,比放在内存中,修改和编译所花的工作更小。

如果class文件中存在描述,则Castor使用这些描述来控制marshalling。
marshalling对象时,一个主要的约束,是要有一个缺省的无参的构造方法。
并且要有get和set方法来进行marshalling和unmarshalling。

Class Descriptors
class descriptors提供了Castor框架必须的信息,
这样class才能正确的marshalling和unmarshalling。
class descriptors包含了field descriptors的集合。

XML格式的class descriptors提供castor框架marshalling所需的信息。
XMLClassDescriptor的实现类是:org.exolab.castor.xml.XMLClassDescriptor.

XML Class Descriptors有四种方法创建,两种基于运行时,两种基于编译时。

Compile-Time Descriptors
使用compile time descriptors,方法之一是实现org.exolab.castor.xml.XMLClassDescriptor,
或者用Source Code Generator来创建描述。



Run-Time Descriptors
使用run tiem descriptors,方法之一是提供一个mapping文件,
让Castor introspect(应该翻译成内省?)
或者组合使用缺省的introspection和特殊的mapping文件。