一、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
- package com.mkyong.core;
- import javax.xml.bind.annotation.XmlAttribute;
- import javax.xml.bind.annotation.XmlElement;
- import javax.xml.bind.annotation.XmlRootElement;
- @XmlRootElement
- public class Customer {
- String name;
- int age;
- int id;
- public String getName() {
- return name;
- }
- @XmlElement
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- @XmlElement
- public void setAge(int age) {
- this.age = age;
- }
- public int getId() {
- return id;
- }
- @XmlAttribute
- public void setId(int id) {
- this.id = id;
- }
- }
第三步:main方法把java bean轉化為xml字元串
[java] view plain copy
- package com.mkyong.core;
- import java.io.File;
- import javax.xml.bind.JAXBContext;
- import javax.xml.bind.JAXBException;
- import javax.xml.bind.Marshaller;
- public class JAXBExample {
- public static void main(String[] args) {
- Customer customer = new Customer();
- customer.setId(100);
- customer.setName("mkyong");
- customer.setAge(29);
- try {
- File file = new File("C:\\file.xml");
- JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
- Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
- // output pretty printed
- jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
- jaxbMarshaller.marshal(customer, file);
- jaxbMarshaller.marshal(customer, System.out);
- } catch (JAXBException e) {
- e.printStackTrace();
- }
- }
- }
下面是輸出:
[html] view plain copy
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <customer id="100">
- <age>29</age>
- <name>mkyong</name>
- </customer>
jdk提供了xjc工具可以使xsd自動生成相應的java bean,這大大提高了開發的效率。同時,我們也可以使用trang.jar把xml輕松轉化為xsd。下面是使用的舉例。
第一步:把資料庫表映射為xml
[html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <User u_id="1" u_name="moto" u_email="[email protected]"
- u_mood="今天放假了" u_state="online" u_mobile="12345678901"
- u_hometown="山西" u_job="IT軟體工程師" u_avatar="w34353453543r53" />
第二步:使用 trang.jar 轉化為xsd檔案。在指令行執行:
[html] view plain copy
- java -jar D:\lib\trang.jar user.xml user.xsd
下面,是生成的User.java。
[java] view plain copy
- //
- // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6
- // See <a href="http://java.sun.com/xml/jaxb" target="_blank" rel="external nofollow" >http://java.sun.com/xml/jaxb</a>
- // Any modifications to this file will be lost upon recompilation of the source schema.
- // Generated on: 2011.11.13 at 01:26:07 ���� CST
- //
- package com.moto.server.bean;
- import java.math.BigInteger;
- import javax.xml.bind.annotation.XmlAccessType;
- import javax.xml.bind.annotation.XmlAccessorType;
- import javax.xml.bind.annotation.XmlAttribute;
- import javax.xml.bind.annotation.XmlRootElement;
- import javax.xml.bind.annotation.XmlSchemaType;
- import javax.xml.bind.annotation.XmlType;
- import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
- import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "")
- @XmlRootElement(name = "User")
- public class User {
- @XmlAttribute(name = "u_avatar", required = true)
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
- @XmlSchemaType(name = "NCName")
- protected String uAvatar;
- @XmlAttribute(name = "u_email", required = true)
- @XmlSchemaType(name = "anySimpleType")
- protected String uEmail;
- @XmlAttribute(name = "u_hometown", required = true)
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
- @XmlSchemaType(name = "NCName")
- protected String uHometown;
- @XmlAttribute(name = "u_id", required = true)
- protected BigInteger uId;
- @XmlAttribute(name = "u_job", required = true)
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
- @XmlSchemaType(name = "NCName")
- protected String uJob;
- @XmlAttribute(name = "u_mobile", required = true)
- protected BigInteger uMobile;
- @XmlAttribute(name = "u_mood", required = true)
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
- @XmlSchemaType(name = "NCName")
- protected String uMood;
- @XmlAttribute(name = "u_name", required = true)
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
- @XmlSchemaType(name = "NCName")
- protected String uName;
- @XmlAttribute(name = "u_state", required = true)
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
- @XmlSchemaType(name = "NCName")
- protected String uState;
- public String getUAvatar() {
- return uAvatar;
- }
- public void setUAvatar(String value) {
- this.uAvatar = value;
- }
- public String getUEmail() {
- return uEmail;
- }
- public void setUEmail(String value) {
- this.uEmail = value;
- }
- public String getUHometown() {
- return uHometown;
- }
- public void setUHometown(String value) {
- this.uHometown = value;
- }
- public BigInteger getUId() {
- return uId;
- }
- public void setUId(BigInteger value) {
- this.uId = value;
- }
- public String getUJob() {
- return uJob;
- }
- public void setUJob(String value) {
- this.uJob = value;
- }
- public BigInteger getUMobile() {
- return uMobile;
- }
- public void setUMobile(BigInteger value) {
- this.uMobile = value;
- }
- public String getUMood() {
- return uMood;
- }
- public void setUMood(String value) {
- this.uMood = value;
- }
- public String getUName() {
- return uName;
- }
- public void setUName(String value) {
- this.uName = value;
- }
- public String getUState() {
- return uState;
- }
- public void setUState(String value) {
- this.uState = value;
- }
- }
另外也可以利用eclipse的jaxb項目自己的菜單功能也可以根據 java class自動生成xsd檔案,如下圖
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM2kTOyQzMxEzNxIDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)