新的起點 新的開始

          快樂生活 !

          JavaBean之間拷貝利器-Dozer(2) 映射數據類型不一致,級聯映射與自定義映射

              上次大概介紹了為什么要使用Dozer,以及對Dozer一個簡單介紹。 今天我們來討論如何使用Dozer映射復雜類型:
                      1. 數據類型不一致。
                      2. 級聯映射。
                      3. 自定義映射。
              在討論之前,我們來說說一個朋友在上篇留言中提到的一個問題。估計大家應該都很關心。這個問題就是性能問題。Dozer其實底層使用了現成的BeanUtil,通過反射來映射,況且Dozer應用了Cache技術,應該比自個通過BeanUtils映射性能要好點。所以一般的應用應該不存在性能問題。

              Dozer對于基本類型之間轉換是不用配置的,比如Sting <------>Integer ,只要屬性名稱相同就Ok了。
              而常用的Date與String映射配置如下:
            <mapping date-format="MM-dd-yyyy">
          <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
          <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
          <field>
          <a>birthday</a>
          <b>dateOfBirth</b>
          </field>
          </mapping>
             指明 CustomerPo里面的birthday對應CustomerVo里面的dateOfBirth.并且是Date與String之間雙向映射。

              對于屬性名稱不一致,也僅僅需要一個配置文件,如下:
                <mapping>
                <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
                <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
                 <field>
                 <a>type</a>
               <b>transferType</b>
             </field>
           </mapping>
               指明 CustomerPo里面的type 對應CustomerVo里面的transferType.

              而對以級聯,比如CustomerPo里面的一個屬性映射為CustomerVo里么一個對象的屬性,下面的配置就可以了
                     <mapping>
                <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
                <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
                 <field>
                 <a>type</a>
               <b>transferType.type</b>
             </field>
              </mapping>

               上面其實就是Dozer基本用法,也涵蓋了大多數應用場景,可見基本不需要寫代碼,僅僅一個配置文件搞定,簡單吧。

                而對以更個性化的映射,就需要寫代碼了, 比如在CustomerPo中的into類型的transferId ,映射CustomerVo  String 類型transferType, 如果transferId =1 對應transferType=“immediateTranfer” 如果transferId =2 對應transferType=“scheduleTransfer” 反之亦然。就要寫一個Customer的Map了, 如下:
          import org.dozer.CustomConverter;

          public class CustomerMap implements CustomConverter {

              
          public Object convert(Object destinationFieldValue,
                      Object sourceFieldValue, Class
          <?> destinationClass,
                      Class
          <?> sourceClass) {
                  Object returnVale 
          = null;
                  
          if(sourceFieldValue!=null){
                      
          if(sourceFieldValue instanceof Integer ){
                          
          if((Integer)sourceFieldValue == 1){
                              returnVale 
          ="immediateTranfer";
                          }

                          
          if((Integer)sourceFieldValue == 2){
                              returnVale 
          ="scheduleTransfer";
                          }

                          
                      }

                      
          if(sourceFieldValue instanceof String ){
                          
          if("immediateTranfer".equals(destinationFieldValue)){
                              returnVale 
          =1;
                          }

                          
          if("scheduleTransfer".equals(destinationFieldValue)){
                              returnVale 
          =2;
                          }

                          
                      }


                  }

                  
          return returnVale;
              }


          }

              然后在配置文件配置就Ok了 如下:
                <mapping>
                    <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
                   <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
                 <field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
                 <a>type</a>
                <b>transferType</b>
                </field>
              </mapping>

          下面就是一個完整的配置文件:

          <?xml version="1.0" encoding="UTF-8"?>
          <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation
          ="http://dozer.sourceforge.net E:\dozer\dozer-5.0-src\dozer-5.0\src\site\resources\schema\beanmapping.xsd"
              xmlns
          ="http://dozer.sourceforge.net">
              
          <mapping  date-format="yyyy-MM-dd">
                  
          <class-a>net.blogjava.vincent.pojo.UserInfo</class-a>
                  
          <class-b>net.blogjava.vincent.vo.UserInfoVo</class-b>
                  
          <field>
                      
          <a>colleage.name</a>
                      
          <b>schoolName</b>
                  
          </field>
              
          </mapping>
                  
          <mapping>
                  
          <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
                  
          <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
                   
          <field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
                      
          <a>type</a>
                      
          <b>transferType</b>
                  
          </field>
              
          </mapping>

          </mappings>
              在后續的內容中,我們討論如何得到映射統計數據。

          posted on 2009-04-13 22:28 advincenting 閱讀(3138) 評論(1)  編輯  收藏

          評論

          # re: JavaBean之間拷貝利器-Dozer(2) 映射數據類型不一致,級聯映射與自定義映射 2009-04-16 13:36 popoer

          討厭xml~~~~  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          公告

          Locations of visitors to this pageBlogJava
        1. 首頁
        2. 新隨筆
        3. 聯系
        4. 聚合
        5. 管理
        6. <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統計

          常用鏈接

          留言簿(13)

          隨筆分類(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類

          IT人的英語學習網站

          JAVA站點

          優秀個人博客鏈接

          官網學習站點

          生活工作站點

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 靖江市| 南丰县| 五家渠市| 洪雅县| 玛沁县| 资源县| 梓潼县| 望谟县| 远安县| 湄潭县| 瑞安市| 莱阳市| 邵阳县| 太谷县| 新安县| 简阳市| 安阳县| 南召县| 沁源县| 丹凤县| 莎车县| 四川省| 嘉禾县| 临沭县| 阳高县| 洛川县| 东明县| 都安| 巫山县| 敦化市| 宝清县| 新宁县| 孙吴县| 平顶山市| 方正县| 池州市| 永德县| 普安县| 黄浦区| 正镶白旗| 枣庄市|