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

          真正的快樂來源于創造

            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 何楊 閱讀(296) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 泰州市| 阿克| 南丹县| 明水县| 淮安市| 娄底市| 吐鲁番市| 灵川县| 新竹市| 黑河市| 涟源市| 阿克苏市| 明光市| 琼结县| 古浪县| 台中市| 白河县| 华阴市| 个旧市| 普定县| 开封市| 伊川县| 河津市| 山西省| 北京市| 兴义市| 宣城市| 墨玉县| 绵竹市| 乡宁县| 仙桃市| 绥化市| 郁南县| 芜湖市| 德格县| 岢岚县| 安徽省| 湖口县| 乐平市| 洞头县| 卢氏县|