新的起點(diǎn) 新的開始

          快樂生活 !

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

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

              Dozer對于基本類型之間轉(zhuǎn)換是不用配置的,比如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對應(yīng)CustomerVo里面的dateOfBirth.并且是Date與String之間雙向映射。

              對于屬性名稱不一致,也僅僅需要一個(gè)配置文件,如下:
                <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 對應(yīng)CustomerVo里面的transferType.

              而對以級(jí)聯(lián),比如CustomerPo里面的一個(gè)屬性映射為CustomerVo里么一個(gè)對象的屬性,下面的配置就可以了
                     <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>

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

                而對以更個(gè)性化的映射,就需要寫代碼了, 比如在CustomerPo中的into類型的transferId ,映射CustomerVo  String 類型transferType, 如果transferId =1 對應(yīng)transferType=“immediateTranfer” 如果transferId =2 對應(yīng)transferType=“scheduleTransfer” 反之亦然。就要寫一個(gè)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>

          下面就是一個(gè)完整的配置文件:

          <?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>
              在后續(xù)的內(nèi)容中,我們討論如何得到映射統(tǒng)計(jì)數(shù)據(jù)。

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

          評(píng)論

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

          討厭xml~~~~  回復(fù)  更多評(píng)論   


          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          公告

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(13)

          隨筆分類(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類

          IT人的英語學(xué)習(xí)網(wǎng)站

          JAVA站點(diǎn)

          優(yōu)秀個(gè)人博客鏈接

          官網(wǎng)學(xué)習(xí)站點(diǎn)

          生活工作站點(diǎn)

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 开封县| 章丘市| 城固县| 孝感市| 辽阳市| 根河市| 铜川市| 灵寿县| 镇平县| 江口县| 阜南县| 古丈县| 安龙县| 崇文区| 仙桃市| 曲靖市| 丰原市| 福海县| 安国市| 新平| 河北区| 格尔木市| 凤山市| 富平县| 广东省| 长丰县| 长海县| 满洲里市| 甘孜| 新泰市| 固安县| 松潘县| 舞阳县| 宜兰市| 永州市| 黔东| 海林市| 鸡泽县| 荣成市| 海口市| 香港|