過往的項目中數據存儲都離不開數據庫,不過最近作的一個項目的某些數據(好比人員信息、菜單、權限等等)卻徹底沒有涉及任何數據庫操做,直接XML搞定。這裏無心比較優劣,由於數據庫存儲和XML存儲本就有不一樣的適用場景,盲目比較毫無心義,只是由於業務須要,僅此而已。先來概念一下——XML,可擴展標記語言,設計宗旨是用來傳輸數據而非顯示數據,其遵循W3C標準,是一種通用的數據交換格式,具備很強的跨平臺性,而且數據無需轉換,因此,若是你要將數據作跨平臺傳輸,那麼把數據保存在 XML 文件中是有好處的。固然,這裏要說明,因爲XML僅僅是做爲一種文檔模式的結構化存儲,因此並不適用於大數據量的存儲。如今的Java中有不少類庫好比DOM、SAX、JDOM和DOM4J等等均可以操做XML,但若是僅僅是想作JavaBean和XML節點元素的互相轉換,而不涉及動態XML的處理,那麼JAXB絕對是一個不錯的選擇。在比較新的jdk版本中,JAXB都是jdk的擴展包javax中自帶的類庫,不須要你引入第三方jar包。java
JAXBContext類,是應用的入口,經過該類建立序列化和反序列化對象,也即編組對象和解組對象; Marshaller 編組接口,將Java對象序列化爲XML數據; Unmarshaller 解組接口,將XML數據反序列化爲Java對象。數據庫
@XmlRootElement,將Java類或枚舉映射成XML元素根節點,是惟一一個必須註解,name屬性指定根節點名稱,不指定默認爲類名的小寫;數組
@XmlElement,將Java類的一個屬性映射爲XML節點元素,name屬性可自定義元素名;app
@XmlAttribute,將Java類的一個屬性映射爲XML節點元素的屬性,name屬性可自定義屬性名;函數
@XmlType,將Java類或枚舉類型映射到XML模式類型,常與@XmlRootElement、@XmlAccessorType共用,propOrder屬性定義字段生成的XML節點順序;性能
@XmlAccessorType,控制字段或屬性的序列化。屬性XmlAccessType有4個常量值:FIELD表示JAXB將自動綁定Java類中的每一個非靜態的(static)、非瞬態的(由@XmlTransient標註)字段到XML;PROPERTY表示java對象中全部經過getter/setter方式綁定成屬性到XML;PUBLIC_MEMBER表示Java對象中全部的public訪問權限的成員變量和經過getter/setter方式訪問的成員變量,該值爲默認值;NONE表示Java對象的全部屬性都不映射爲XML的元素;大數據
@XmlAccessorOrder,控制JAXB 綁定類中屬性和字段的排序,有兩個屬性,AccessorOrder.ALPHABETICAL——對生成的XML元素按字母書序排序,XmlAccessOrder.UNDEFINED——不排序,默認爲該值;設計
@XmlJavaTypeAdapter,自定義適配器(即擴展抽象類XmlAdapter並覆蓋marshal()和unmarshal()方法),解決日期(Date),數字(Number)格式化問題;對象
@XmlElementWrapper ,對於數組或集合(即包含多個元素的成員變量),生成一個包裝該數組或集合的XML元素(稱爲包裝器),該註解只能用在集合上;blog
@XmlTransient ,用於標示在由Java對象映射XML時,忽略此屬性,在生成的XML文件中將不出現此元素。
① 若是JavaBean中定義了有參的構造器,那麼必須同時定義無參構造器,不然轉XML會拋無默認構造函數的異常;
② 成員變量值爲NULL時,將不會映射成對應的XML元素——因爲基本數據類型默認值不爲空,因此基本數據類型不設值也會映射成XML元素,值爲默認值,因此若是模型須要基本數據,在屬性定義的時候儘可能使用包裝類型;
③ @XmlAccessorType 註解中若是屬性值爲XmlAccessType.FIELD,則表示經過成員變量來映射,set/get方法上的映射註解就是多餘的,因此若是此時set/get方法上再標註元素或者屬性映射註解,將拋屬性重複性異常;屬性值爲XmlAccessType.NONE不映射爲XML元素的前提是Java字段或set/get方法上都沒有映射註解;
④ @XmlType propOrder屬性可以自定義字段的排序,該屬性若是設置,要麼寫成{}的形式,不然在就必須將全部@XmlElement標註或者沒有@XmlElement標註的但實際上會被映射爲XML節點的字段添加到排序列表,否則會拋異常;若是propOrder屬性設置有值,@XmlAccessorOrder註解的元素排序規則將失效;