JDK6的新特性之二:使用JAXB2来实现对象与XML之间的映射

JDK6的新特性之二:使用JAXB2来实现对象与XML之间的映射
JAXB是JavaArchitectureforXMLBinding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。我们把对象与关系数据库之间的映射称为ORM,其实也可以把对象与XML之间的映射称为OXM(ObjectXMLMapping).原来JAXB是JavaEE的一部分,在JDK6中,SUN将其放到了JavaSE中,这也是SUN的一贯做法。JDK6中自带的这个JAXB版本是2.0,比起1.0(JSR31)来,JAXB2(JSR222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。实际上,在JavaEE5.0中,EJB和WebServices也通过Annotation来简化开发工作。另外,JAXB2在底层是用StAX(JSR173)来处理XML文档。闲话不多说了,下面用代码演示在JDK6中如何来用JAXB2

publicclassJAXB2Tester{
publicstaticvoidmain(String[]args)throwsJAXBException,IOException{
JAXBContextcontext=JAXBContext.newInstance(Person.class);
//下面代码演示将对象转变为xml
Marshallerm=context.createMarshaller();
Addressaddress=newAddress("China","Beijing","Beijing","ShangDiWest","100080");
Personp=newPerson(Calendar.getInstance(),"JAXB2",address,Gender.MALE,"SW");
FileWriterfw=newFileWriter("person.xml");
m.marshal(p,fw);

//下面代码演示将上面生成的xml转换为对象
FileReaderfr=newFileReader("person.xml");
Unmarshallerum=context.createUnmarshaller();
Personp2=(Person)um.unmarshal(fr);
System.out.println("Country:"+p2.getAddress().getCountry());
}
}

@XmlRootElement//表示person是一个根元素
classPerson{
@XmlElement
CalendarbirthDay;//birthday将作为person的子元素

@XmlAttribute
Stringname;//name将作为person的的一个属性

publicAddressgetAddress(){
returnaddress;
}

@XmlElement
Addressaddress;//address将作为person的子元素

@XmlElement
Gendergender;//gender将作为person的子元素

@XmlElement
Stringjob;//job将作为person的子元素

publicPerson(){
}

publicPerson(CalendarbirthDay,Stringname,Addressaddress,Gendergender,Stringjob){
this.birthDay=birthDay;
this.name=name;
this.address=address;
this.gender=gender;
this.job=job;
}
}

enumGender{
MALE(true),
FEMALE(false);
privatebooleanvalue;
Gender(boolean_value){
value=_value;
}
}

classAddress{
@XmlAttribute
Stringcountry;
@XmlElement
Stringstate;
@XmlElement
Stringcity;
@XmlElement
Stringstreet;
Stringzipcode;//由于没有添加@XmlElement,所以该元素不会出现在输出的xml中

publicAddress(){
}

publicAddress(Stringcountry,Stringstate,Stringcity,Stringstreet,Stringzipcode){
this.country=country;
this.state=state;
this.city=city;
this.street=street;
this.zipcode=zipcode;
}


publicStringgetCountry(){
returncountry;
}
}

运行该程序,我们会得到一个person.xml的文件,如下:

<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>

<personname="JAXB2">
<birthDay>2006-12-28T08:49:27.203+00:00</birthDay>
<addresscountry="China">
<state>Beijing</state>
<city>Beijing</city>
<street>ShangDiWest</street>
</address>
<gender>MALE</gender>
<job>SW</job>
</person>
控制台会输出

Country:China

最后,想说一点,除了JAXB之外,我们还可以通过XMLBeans和Castor等来实现同样的功能。

你可能感兴趣的:(JAXB)