<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)  編輯  收藏
    主站蜘蛛池模板: **真实毛片免费观看 | 日本视频一区在线观看免费| 国产色爽免费无码视频| 九九免费观看全部免费视频| 深夜特黄a级毛片免费播放| 精品久久久久久亚洲中文字幕| 亚洲色www永久网站| 亚洲最大的成人网| 亚洲国产精品无码中文lv| 最新亚洲卡一卡二卡三新区| 2019亚洲午夜无码天堂| 国产亚洲精品VA片在线播放| 亚洲国产成人久久一区二区三区| 亚洲国产精品无码第一区二区三区 | 国色精品va在线观看免费视频| 两个人的视频www免费| 最新国产乱人伦偷精品免费网站 | 亚洲av无码专区在线观看亚| 国产亚洲漂亮白嫩美女在线| 一级做受视频免费是看美女| 男女拍拍拍免费视频网站| 免费看黄的成人APP| 51在线视频免费观看视频| 一二三四在线观看免费高清中文在线观看| 成人免费a级毛片无码网站入口| 日韩在线免费看网站| 亚洲国产高清精品线久久| 久久精品国产69国产精品亚洲| 亚洲人成依人成综合网| 成人亚洲国产va天堂| 国产精品亚洲二区在线| 国产线视频精品免费观看视频| 玖玖在线免费视频| 99久久综合国产精品免费| 国产yw855.c免费视频| 久久影院亚洲一区| 亚洲精品亚洲人成在线观看麻豆 | 久久精品国产亚洲AV网站| 亚洲avav天堂av在线网爱情| 国产偷国产偷亚洲高清在线| 最近的2019免费中文字幕|