當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

          如果需要將表數據轉化為XML形式數據的話,如果我們使用Spring的JDBC Template,那么常需要做的工作是創建一個RowMapper匿名類,在其中將字段與領域對象的某個屬性匹配上,然后得到領域對象鏈表形式的結果,此后展開這個集合,再將字段轉化為XML數據,其中進行了兩次名稱和值之間的匹配,硬編碼較多,比較費時間。如果我們利用Metadata(Metadata是解釋數據的數據,如果我們的研究對象是表格中的數據,那么表頭就是表格中數據的Metadata)則可以有效簡化這一過程。

          下面先看需求,有一個emp雇員表,表中包括id,姓名name,年齡age和地址addr四個字段,如下所示:


          我們需要把表中的記錄取出并變成如下格式的字符串:

          <employees>
              
          <employee>
                  
          <id>1</id>
                  
          <name>andy</name>
                  
          <age>31</age>
                  
          <address>54435454</address>
              
          </employee>
              
          <employee>
                  
          <id>2</id>
                  
          <name>bill</name>
                  
          <age>32</age>
                  
          <address>rwerewrqeqw</address>
              
          </employee>
              
          <employee>
                  
          <id>3</id>
                  
          <name>cindy</name>
                  
          <age>33</age>
                  
          <address>342554345</address>
              
          </employee>
              
          <employee>
                  
          <id>4</id>
                  
          <name>douglas</name>
                  
          <age>34</age>
                  
          <address>rtwetr23423</address>
              
          </employee>
              
          <employee>
                  
          <id>5</id>
                  
          <name>edin</name>
                  
          <age>35</age>
                  
          <address>rfwsr34223</address>
              
          </employee>
          </employees>

          下面是負責取出數據的DAO類:
          package com.heyang.dao;

          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.util.ArrayList;
          import java.util.List;

          import org.springframework.jdbc.core.RowMapper;

          import com.heyang.dao.base.Dao;
          import com.heyang.domain.NameValue;

          /**
           * 用于行業和類別的Dao
           * 
          @author 何楊(heyang78@gmail.com)
           *
           * 
          @since 2008-8-27 上午10:24:38
           * 
          @version 1.00
           
          */

          public class EmpDao extends Dao{
              
              
          /**
               * 取得雇員鏈表
               * 
          @return
               
          */

              @SuppressWarnings(
          "unchecked")
              
          public List<List<NameValue>> getAll(){
                  
                  String sql 
          = " select id, name, age, addr as address from emp ";

                  
          class EmpRowMapper implements RowMapper {
                      
          public Object mapRow(ResultSet rs, int index) throws SQLException {
                          List
          <NameValue> ls=new ArrayList<NameValue>();
                          
                          
          int n=rs.getMetaData().getColumnCount();
                          
                          
          for(int i=1;i<=n;i++){
                              NameValue nv
          =new NameValue(rs.getMetaData().getColumnName(i),rs.getString(i));
                              ls.add(nv);
                          }

                          
                          
          return ls;
                      }

                  }

              
                  
          return jdbcTemplate.query(sql, new EmpRowMapper());
              }

          }

          這里沒有用硬編碼的方式從行集中逐個取出字段,而是通過行集的Metadata得到字段的個數,再依次遍歷下去,在循環中得到的字段名稱和字段值放到對象NameValue中,它的代碼如下:
          package com.heyang.domain;

          /**
           * 名稱-值 結構
           * 
          @author 何楊
           * @date 2009-10-26
           * @time 下午02:02:00
           
          */

          public class NameValue{
              
          private String name;
              
          private String value;
              
              
          public NameValue(){
                  
          this("","");
              }

              
              
          public NameValue(String name,String value){
                  
          this.name=name;
                  
          this.value=value;
              }

              
              
          public String getName() {
                  
          return name;
              }

              
          public void setName(String name) {
                  
          this.name = name;
              }

              
          public String getValue() {
                  
          return value;
              }

              
          public void setValue(String value) {
                  
          this.value = value;
              }

          }

          將返回的表格數據鏈表變成最終的XML形式字符串的代碼如下:
          package com.heyang;

          import java.util.List;

          import com.heyang.dao.EmpDao;
          import com.heyang.domain.NameValue;
          import com.heyang.util.SpringUtil;

          /**
           * 雇員服務類
           * 
           * 
          @author 何楊
           * @date 2009-10-26
           * @time 下午01:35:41
           
          */

          public class EmpService implements IEmp{
              
          /**
               * 取得XML形式的雇員列表
               
          */

              
          public String fetchEmps() {
                  EmpDao dao
          =(EmpDao)SpringUtil.getBean("empDao");
                  StringBuilder sb
          =new StringBuilder();
                  
                  List
          <List<NameValue>> ls=dao.getAll();
                  
                  sb.append(
          "<employees>");
                  
          for(List<NameValue> lsItem:ls){
                      sb.append(
          "<employee>");
                      
          for(NameValue nv:lsItem){
                          sb.append(
          "<"+nv.getName()+">");
                          sb.append(nv.getValue());
                          sb.append(
          "</"+nv.getName()+">");
                      }

                      sb.append(
          "</employee>");
                  }

                  sb.append(
          "</employees>");
                  
                  
          return sb.toString();
              }

              
          }
          從上述代碼中可以見到,除了根節點名employees和子節點名employee外,其它子節點名都不是硬編碼而是從NameValue中取出,這樣就大大減少了硬編碼和逐個匹配的工作量。

          綜上所述,由于引入了Metadata的幫助,剩下的主要是sql語句中別名的書寫和根節點子節點的書寫了,這樣乏味的工作得到了簡化,出錯的幾率也大大減小了。

          以上代碼可以從這里下載,需要的包請自行導入。
          posted on 2009-10-27 10:13 何楊 閱讀(297) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 滦平县| 历史| 武威市| 克拉玛依市| 延吉市| 朝阳县| 台北县| 马关县| 石狮市| 怀宁县| 教育| 云霄县| 英超| 璧山县| 天气| 盐源县| 前郭尔| 鄂伦春自治旗| 嘉义市| 永清县| 闸北区| 盐源县| 普宁市| 扎赉特旗| 康乐县| 凤山县| 佛坪县| 延川县| 棋牌| 三亚市| 灵川县| 禹州市| 瑞安市| 皮山县| 报价| 栾城县| 确山县| 班戈县| 靖江市| 大姚县| 梅州市|