<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    dozer與BeanUtils

    Posted on 2007-02-06 12:45 dennis 閱讀(2530) 評論(0)  編輯  收藏 所屬分類: java

    呵呵,在《develope J2EE without EJB》中,DTO被狠很地批判了一把,rod說這完全是反模式??蓪嶋H項目當中,我們還是不得不在使用。VO,PO,一牽扯到概念總是多么復雜。。。把一個PO從頭傳到尾??從頁面到數據庫,一捅到底?NO,NO,萬一你要顯示給用戶的是幾個PO的結合怎么辦?萬一我們只是需要某幾個屬性組合在一起顯示怎么辦?一捅到底的策略是多么丑陋,而且你完全把你的數據庫設計模型暴露給用戶。所以我們需要一些map工具來轉換,在這方面,過去我只知道有個 BeanUtils,不夠靈活,而今天,接觸了下dozer,啊,跟spring一樣的理念!靈活多變,你想怎么映射,想怎么換都可以??纯此С值霓D換類型:

    ? Primitive to Primitive Wrapper
    ? Primitive to Custom Wrapper
    ? Primitive Wrapper to Primitive Wrapper

    ? Primitive to Primitive
    ? Complex Type to Complex Type
    ? String to Primitive
    ? String to Primitive Wrapper
    ? String to Complex Type if the Complex Type contains a String constructor
    ? Each of these can be mapped to one another: java.util.Date, java.sql.Date, java.sql.Time,
    java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar
    ? String to any of the supported Date/Calendar Objects if an explicit date format mapping attribute is
    specified.
    ? Objects containing a toString() method that produces a long representing time in (ms) to any
    supported Date/Calendar object.

    幾乎我們能想到的,它都提供了方法來做到。而且dozer可以很容易地跟spring集成。下面舉個簡單例子:

    定義一個Book對象:

    package com.denny_blue.dozerdemo;
    public class Book {
    ?private String name;
    ?private String author;
    ?
    ?
    ?public Book(){
    ??
    ?}?
    ?public void setAuthor(String author) {
    ??this.author = author;
    ?}

    ?public String getAuthor() {
    ??return (this.author);
    ?}
    ?public void setName(String name){
    ??this.name=name;
    ?}?
    ?public String getName(){
    ??return this.name;
    ?}
    }
    簡單的,我們要實例化一個對象,然后clone此對象,注意,是clone!

    package com.denny_blue.dozerdemo;
    import net.sf.dozer.util.mapping.DozerBeanMapper;
    import java.util.List;
    import java.util.ArrayList;


    public class MyFirstDozerDemo {
    ?public static void main(String args[]){
    ??Book book1=new Book();
    ??book1.setAuthor("dennis");
    ??book1.setName("dozer demo");
    ??DozerBeanMapper mapper=new DozerBeanMapper();
    ??Book book2=new Book();
    ??mapper.map(book1,book2);
    ? book2=(Book)mapper.map(book1,com.denny_blue.dozerdemo.Book.class);
    ??System.out.println("book2's name:"+book2.getName());
    ?????}
    }?

    OK,如此簡單,我們把book1的屬性完全復制給了book2,兩者現在是完全獨立的對象??扇绻麅H僅是這樣,我們用BeanUtils不是也很容易辦到? book2=(Book)BeanUtils.cloneBean(book1);可如果我要把book1映射給一個完全不同的類的對象怎么辦?而且他們的屬性名也不相同,怎么辦?比如,一個CookBook類:

    package com.denny_blue.dozerdemo;
    public class CookBook {
    ?private String bookName;
    ?private String author;


    ?public CookBook(){}
    ?public String getBookName() {
    ??return (this.bookName);
    ?}

    ?public void setBookName(String bookName) {
    ??this.bookName = bookName;
    ?}

    ?public String getAuthor() {
    ??return (this.author);
    ?}

    ?public void setAuthor(String author) {
    ??this.author = author;
    ?}


    }
    它的bookName屬性與Book的name屬性名不一樣,我們該如何復制?dozer通過xml文件的配置來靈活地達到這個目的。我們配置一個dozerBeanMapping.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mappings PUBLIC "-//DOZER//DTD MAPPINGS//EN"
    "<mappings>
    <configuration>
    <stop-on-errors>false</stop-on-errors>
    <date-format>MM/dd/yyyy HH:mm</date-format>
    <wildcard>true</wildcard>
    </configuration>
    <mapping>
    <class-a>com.denny_blue.dozerdemo.Book</class-a>
    <class-b>com.denny_blue.dozerdemo.CookBook</class-b>
    <field>
    <a>name</a>
    <b>bookName</b>
    </field>
    <field>
    <a>author</a>
    <b>author</b>
    </field>
    </mapping>
    </mappings>

    如上所示,<class-a>指定所要復制的源對象,<class-b>復制的目標對象,<a>源對象的屬性名, <b>目標對象的屬性名。wildcard默認為true,在此時默認對所有屬性進行map,如果為false,則只對在xml文件中配置的屬性進行map。此時的demo 看起來像這樣:

    package com.denny_blue.dozerdemo;
    import net.sf.dozer.util.mapping.DozerBeanMapper;
    import java.util.List;
    import java.util.ArrayList;


    public class MyFirstDozerDemo {
    ?public static void main(String args[]){
    ??Book book1=new Book();
    ??book1.setAuthor("dennis");
    ??book1.setName("dozer demo");
    ??DozerBeanMapper mapper=new DozerBeanMapper();
    ? book2=(Book)mapper.map(book1,com.denny_blue.dozerdemo.Book.class);
    ? CookBook cookBook=new CookBook();
    ? List myMappingFiles = new ArrayList();
    ? myMappingFiles.add("dozerBeanMapping.xml");
    ? mapper.setMappingFiles(myMappingFiles);
    ? cookBook=(CookBook)mapper.map(book1,CookBook.class);
    ? System.out.println("cookBook's name:"+?? cookBook.getBookName()+"???? cookBook's author:"+
    ????????????????????? cookBook.getAuthor());
    ?}
    }

    通過mapper.setMappingFiles()設置映射文件,可以添加多個配置文件,也可以把所有的映射寫在一個配置文件里面。??更多復雜例子請見它自帶的doc。

    主站蜘蛛池模板: 亚洲在成人网在线看| 亚洲欧洲一区二区三区| 国产A在亚洲线播放| A毛片毛片看免费| 亚洲精品无码永久中文字幕 | 亚洲精品V天堂中文字幕| 妻子5免费完整高清电视| 亚洲13又紧又嫩又水多| 91在线视频免费播放| 亚洲中文字幕日本无线码| 国产精品偷伦视频观看免费 | eeuss影院免费92242部| 亚洲熟女综合色一区二区三区 | 日本v片免费一区二区三区 | 相泽亚洲一区中文字幕| 免费看成人AA片无码视频吃奶| 久久精品免费电影| 亚洲va久久久噜噜噜久久| 免费91麻豆精品国产自产在线观看| 51视频精品全部免费最新| 亚洲精品在线免费看| 国产1024精品视频专区免费| 久久综合久久综合亚洲| 国产精品免费_区二区三区观看| 国产精品免费视频播放器| 老牛精品亚洲成av人片| 亚洲人成人网站在线观看| a级在线观看免费| 亚洲欧洲日本国产| 免费一级肉体全黄毛片| 在线观看片免费人成视频无码| A在线观看免费网站大全| 综合偷自拍亚洲乱中文字幕| 亚洲Aⅴ无码一区二区二三区软件| 亚洲色偷偷偷网站色偷一区| 最新中文字幕电影免费观看| 黄色免费在线网址| 亚洲一区二区三区电影| 免费国产综合视频在线看| 无码AV片在线观看免费| 亚洲AV成人精品一区二区三区|