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

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

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

    當(dāng)柳上原的風(fēng)吹向天際的時(shí)候...

    真正的快樂(lè)來(lái)源于創(chuàng)造

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

    如果需要將表數(shù)據(jù)轉(zhuǎn)化為XML形式數(shù)據(jù)的話,如果我們使用Spring的JDBC Template,那么常需要做的工作是創(chuàng)建一個(gè)RowMapper匿名類,在其中將字段與領(lǐng)域?qū)ο蟮哪硞€(gè)屬性匹配上,然后得到領(lǐng)域?qū)ο箧湵硇问降慕Y(jié)果,此后展開這個(gè)集合,再將字段轉(zhuǎn)化為XML數(shù)據(jù),其中進(jìn)行了兩次名稱和值之間的匹配,硬編碼較多,比較費(fèi)時(shí)間。如果我們利用Metadata(Metadata是解釋數(shù)據(jù)的數(shù)據(jù),如果我們的研究對(duì)象是表格中的數(shù)據(jù),那么表頭就是表格中數(shù)據(jù)的Metadata)則可以有效簡(jiǎn)化這一過(guò)程。

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


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

    <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>

    下面是負(fù)責(zé)取出數(shù)據(jù)的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;

    /**
     * 用于行業(yè)和類別的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());
        }

    }

    這里沒(méi)有用硬編碼的方式從行集中逐個(gè)取出字段,而是通過(guò)行集的Metadata得到字段的個(gè)數(shù),再依次遍歷下去,在循環(huán)中得到的字段名稱和字段值放到對(duì)象NameValue中,它的代碼如下:
    package com.heyang.domain;

    /**
     * 名稱-值 結(jié)構(gòu)
     * 
    @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;
        }

    }

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

    import java.util.List;

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

    /**
     * 雇員服務(wù)類
     * 
     * 
    @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();
        }

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

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

    以上代碼可以從這里下載,需要的包請(qǐng)自行導(dǎo)入。
    posted on 2009-10-27 10:13 何楊 閱讀(293) 評(píng)論(0)  編輯  收藏
    主站蜘蛛池模板: 免费在线观看h片| 免费精品久久天干天干| 永久免费av无码网站韩国毛片 | 亚洲AV色无码乱码在线观看| 性短视频在线观看免费不卡流畅 | 污网站免费在线观看| 免费看无码自慰一区二区| 国产亚洲福利在线视频| 免费看大美女大黄大色| 怡红院亚洲红怡院在线观看| 亚洲成片观看四虎永久| 四虎影视在线看免费观看| 亚洲尤码不卡AV麻豆| 欧洲人免费视频网站在线| 亚洲美女自拍视频| 免费看的黄色大片| 一级毛片a女人刺激视频免费| 亚洲乱码精品久久久久..| 国产成人一区二区三区视频免费| 亚洲一区二区影院| 日韩一区二区a片免费观看 | 精品亚洲aⅴ在线观看| 久久精品免费观看国产| 亚洲午夜电影在线观看| 成在线人永久免费视频播放| 成人a毛片免费视频观看| 亚洲av一综合av一区| 最新欧洲大片免费在线 | 亚洲免费人成在线视频观看 | jizz在线免费播放| 久久亚洲精品国产精品| 午夜视频在线观看免费完整版| 美女视频黄a视频全免费网站色| 久久亚洲伊人中字综合精品| 西西大胆无码视频免费| www免费黄色网| 亚洲大尺码专区影院| 亚洲人午夜射精精品日韩| 67pao强力打造国产免费| 欧美亚洲国产SUV| 亚洲视频在线一区|