天天看點

JAXB: XML 與 Java之間的映射 (OXM)

一、jaxb是什麼  

    JAXB是Java Architecture for XML Binding的縮寫。可以将一個Java對象轉變成為XML格式,反之亦然。 

    我們把對象與關系資料庫之間的映射稱為ORM,其實也可以把對象與XML之間的映射稱為OXM(Object XML Mapping)。原來JAXB是Java EE的一部分,在JDK1.6中,SUN将其放到了Java SE中,這也是SUN的一貫做法。JDK1.6中自帶的這個JAXB版本是2.0,比起1.0(JSR 31)來,JAXB2(JSR 222)用JDK5的新特性Annotation來辨別要作綁定的類和屬性等,這就極大簡化了開發的工作量。 

     二、jaxb應用模式  

    在JAVA EE 5\6中,jaxb可以很友善的與jax-rs、jax-ws內建,極大的簡化了web service接口的開發工作量。 

三、需要的JAR包: eclipselink

  你需要在eclipse中你的項目中引入支援jaxb的jar包,目前的eclipselink2.5.2 or 2.6.x都支援它,下載下傳page如下 

https://www.eclipse.org/eclipselink/downloads/previous_releases.php

或者利用"eclipse marketplace" or "install new software" 去自動安裝即可。

而且這個jar可以支援JPA等,不錯的工具。

jaxb代碼舉例 

第一步:需要引入eclipselink等支援JAXB的包

第二步:編寫java bean; 

[java]  view plain  copy

  1. package com.mkyong.core;  
  2. import javax.xml.bind.annotation.XmlAttribute;  
  3. import javax.xml.bind.annotation.XmlElement;  
  4. import javax.xml.bind.annotation.XmlRootElement;  
  5. @XmlRootElement  
  6. public class Customer {  
  7.     String name;  
  8.     int age;  
  9.     int id;  
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13.     @XmlElement  
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.     public int getAge() {  
  18.         return age;  
  19.     }  
  20.     @XmlElement  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.     public int getId() {  
  25.         return id;  
  26.     }  
  27.     @XmlAttribute  
  28.     public void setId(int id) {  
  29.         this.id = id;  
  30.     }  
  31. }  

第三步:main方法把java bean轉化為xml字元串 

[java]  view plain  copy

  1. package com.mkyong.core;  
  2. import java.io.File;  
  3. import javax.xml.bind.JAXBContext;  
  4. import javax.xml.bind.JAXBException;  
  5. import javax.xml.bind.Marshaller;  
  6. public class JAXBExample {  
  7.     public static void main(String[] args) {  
  8.       Customer customer = new Customer();  
  9.       customer.setId(100);  
  10.       customer.setName("mkyong");  
  11.       customer.setAge(29);  
  12.       try {  
  13.         File file = new File("C:\\file.xml");  
  14.         JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);  
  15.         Marshaller jaxbMarshaller = jaxbContext.createMarshaller();  
  16.         // output pretty printed  
  17.         jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
  18.         jaxbMarshaller.marshal(customer, file);  
  19.         jaxbMarshaller.marshal(customer, System.out);  
  20.           } catch (JAXBException e) {  
  21.         e.printStackTrace();  
  22.           }  
  23.     }  
  24. }  

下面是輸出: 

[html]  view plain  copy

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
  2. <customer id="100">  
  3.     <age>29</age>  
  4.     <name>mkyong</name>  
  5. </customer>  

jdk提供了xjc工具可以使xsd自動生成相應的java bean,這大大提高了開發的效率。同時,我們也可以使用trang.jar把xml輕松轉化為xsd。下面是使用的舉例。 

    第一步:把資料庫表映射為xml 

[html]  view plain  copy

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <User u_id="1" u_name="moto" u_email="[email protected]"   
  3.     u_mood="今天放假了" u_state="online" u_mobile="12345678901"   
  4.     u_hometown="山西" u_job="IT軟體工程師" u_avatar="w34353453543r53" />  

第二步:使用 trang.jar 轉化為xsd檔案。在指令行執行: 

[html]  view plain  copy

  1. java -jar D:\lib\trang.jar user.xml user.xsd  

下面,是生成的User.java。 

[java]  view plain  copy

  1. //  
  2. // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6   
  3. // See <a href="http://java.sun.com/xml/jaxb" target="_blank" rel="external nofollow" >http://java.sun.com/xml/jaxb</a>   
  4. // Any modifications to this file will be lost upon recompilation of the source schema.   
  5. // Generated on: 2011.11.13 at 01:26:07 ���� CST   
  6. //  
  7. package com.moto.server.bean;  
  8. import java.math.BigInteger;  
  9. import javax.xml.bind.annotation.XmlAccessType;  
  10. import javax.xml.bind.annotation.XmlAccessorType;  
  11. import javax.xml.bind.annotation.XmlAttribute;  
  12. import javax.xml.bind.annotation.XmlRootElement;  
  13. import javax.xml.bind.annotation.XmlSchemaType;  
  14. import javax.xml.bind.annotation.XmlType;  
  15. import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;  
  16. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;  
  17. @XmlAccessorType(XmlAccessType.FIELD)  
  18. @XmlType(name = "")  
  19. @XmlRootElement(name = "User")  
  20. public class User {  
  21.     @XmlAttribute(name = "u_avatar", required = true)  
  22.     @XmlJavaTypeAdapter(CollapsedStringAdapter.class)  
  23.     @XmlSchemaType(name = "NCName")  
  24.     protected String uAvatar;  
  25.     @XmlAttribute(name = "u_email", required = true)  
  26.     @XmlSchemaType(name = "anySimpleType")  
  27.     protected String uEmail;  
  28.     @XmlAttribute(name = "u_hometown", required = true)  
  29.     @XmlJavaTypeAdapter(CollapsedStringAdapter.class)  
  30.     @XmlSchemaType(name = "NCName")  
  31.     protected String uHometown;  
  32.     @XmlAttribute(name = "u_id", required = true)  
  33.     protected BigInteger uId;  
  34.     @XmlAttribute(name = "u_job", required = true)  
  35.     @XmlJavaTypeAdapter(CollapsedStringAdapter.class)  
  36.     @XmlSchemaType(name = "NCName")  
  37.     protected String uJob;  
  38.     @XmlAttribute(name = "u_mobile", required = true)  
  39.     protected BigInteger uMobile;  
  40.     @XmlAttribute(name = "u_mood", required = true)  
  41.     @XmlJavaTypeAdapter(CollapsedStringAdapter.class)  
  42.     @XmlSchemaType(name = "NCName")  
  43.     protected String uMood;  
  44.     @XmlAttribute(name = "u_name", required = true)  
  45.     @XmlJavaTypeAdapter(CollapsedStringAdapter.class)  
  46.     @XmlSchemaType(name = "NCName")  
  47.     protected String uName;  
  48.     @XmlAttribute(name = "u_state", required = true)  
  49.     @XmlJavaTypeAdapter(CollapsedStringAdapter.class)  
  50.     @XmlSchemaType(name = "NCName")  
  51.     protected String uState;  
  52.     public String getUAvatar() {  
  53.         return uAvatar;  
  54.     }  
  55.     public void setUAvatar(String value) {  
  56.         this.uAvatar = value;  
  57.     }  
  58.     public String getUEmail() {  
  59.         return uEmail;  
  60.     }  
  61.     public void setUEmail(String value) {  
  62.         this.uEmail = value;  
  63.     }  
  64.     public String getUHometown() {  
  65.         return uHometown;  
  66.     }  
  67.     public void setUHometown(String value) {  
  68.         this.uHometown = value;  
  69.     }  
  70.     public BigInteger getUId() {  
  71.         return uId;  
  72.     }  
  73.     public void setUId(BigInteger value) {  
  74.         this.uId = value;  
  75.     }  
  76.     public String getUJob() {  
  77.         return uJob;  
  78.     }  
  79.     public void setUJob(String value) {  
  80.         this.uJob = value;  
  81.     }  
  82.     public BigInteger getUMobile() {  
  83.         return uMobile;  
  84.     }  
  85.     public void setUMobile(BigInteger value) {  
  86.         this.uMobile = value;  
  87.     }  
  88.     public String getUMood() {  
  89.         return uMood;  
  90.     }  
  91.     public void setUMood(String value) {  
  92.         this.uMood = value;  
  93.     }  
  94.     public String getUName() {  
  95.         return uName;  
  96.     }  
  97.     public void setUName(String value) {  
  98.         this.uName = value;  
  99.     }  
  100.     public String getUState() {  
  101.         return uState;  
  102.     }  
  103.     public void setUState(String value) {  
  104.         this.uState = value;  
  105.     }  
  106. }  

另外也可以利用eclipse的jaxb項目自己的菜單功能也可以根據 java class自動生成xsd檔案,如下圖

JAXB: XML 與 Java之間的映射 (OXM)