Heis的Blog

          保持簡單,保持愚蠢
          隨筆 - 29, 文章 - 1, 評論 - 122, 引用 - 0
          數(shù)據(jù)加載中……

          JasperReport那些事兒(二)——從對象到XML數(shù)據(jù)源

                 記得剛學Jasperreport的時候,在谷歌和百度上搜到的大多數(shù)入門文章都是教授如何使用數(shù)據(jù)庫來做報表的。對于只采用簡單數(shù)據(jù)集和那些直接面向數(shù)據(jù)的報表,使用數(shù)據(jù)庫作為數(shù)據(jù)源是合適的;但是也有很多的報表不是直接面向原始數(shù)據(jù)的,例如財務(wù)報表,都是需要計算和做后續(xù)處理;也有一些報表引用的數(shù)據(jù)粒度小,但是數(shù)量多,使用數(shù)據(jù)庫做數(shù)據(jù)源是不合適的。
                 XML一直被認為是一種很好的描述結(jié)構(gòu)化數(shù)據(jù)的語言。
                 首先XML文件的數(shù)據(jù)結(jié)構(gòu)非常清晰。可以把報表所需要的數(shù)據(jù)集成到一個XML文件上,然后再通過在文件內(nèi)查詢,這比每需要一條數(shù)據(jù)就使用SQL來查詢要顯得更高效和簡單。試想一下,你的同事A告訴你,“報表的數(shù)據(jù)都在這份XML文件里哦”。而同事B則對你說:”那些數(shù)據(jù)在某個數(shù)據(jù)庫里,你自己去查吧。“,你更喜歡聽到哪一句呢?(當然我的語氣上的差別就說明了我的喜好,我老懷疑后者在背向我的那一刻有在奸笑。)
                 其次,現(xiàn)在對象映射到XML的工具很多。哦?你知道我在暗示什么嗎?沒錯,你可以面向?qū)ο螅挥妹嫦虺舐谋砀瘛T谏弦黄恼轮校医o出這樣一個數(shù)據(jù)源。
           1 <?xml version="1.0" encoding="utf-8" ?>
           2 <NameList>
           3     <Person>
           4         <Name>強尼</Name>
           5         <Gender></Gender>
           6         <Age>56</Age>
           7     </Person>
           8     <Person>
           9         <Name>阿美</Name>
          10         <Gender></Gender>
          11         <Age>23</Age>
          12     </Person>
          13     <Person>
          14         <Name>李麗</Name>
          15         <Gender></Gender>
          16         <Age>58</Age>
          17     </Person>
          18     <Person>
          19         <Name>杰森</Name>
          20         <Gender></Gender>
          21         <Age>32</Age>
          22     </Person>
          23     <Person>
          24         <Name>劉三</Name>
          25         <Gender></Gender>
          26         <Age>21</Age>
          27     </Person>
          28 </NameList>
                 
                  如果你是個典型的面向?qū)ο蟮乃伎颊撸瑧?yīng)該馬上想到一個叫Person的Java類。大概像下面這樣。
           1 package com.blogjava.heis.jasper.chapter2;
           2 
           3 public class Person {
           4     
           5     private String name;
           6     private String gender;
           7     private int age;
           8     
           9     private String getName() {
          10         return name;
          11     }
          12     private void setName(String name) {
          13         this.name = name;
          14     }
          15     private String getGender() {
          16         return gender;
          17     }
          18     private void setGender(String gender) {
          19         this.gender = gender;
          20     }
          21     private int getAge() {
          22         return age;
          23     }
          24     private void setAge(int age) {
          25         this.age = age;
          26     }
          27 }
                 
                想像一下,把一個個對象排著隊跳進模板,然后一張完整的報表就出來了,不用管那些煩人的Sql,那應(yīng)該是多么美好的一件事兒。面向?qū)ο蠊皇俏覀兊母R簟=酉聛砜纯次覀內(nèi)绾伟褜ο筠D(zhuǎn)換成XML文件。
          package com.blogjava.heis.jasper.chapter2;

          import java.io.File;
          import java.io.FileWriter;
          import java.io.StringWriter;
          import java.util.ArrayList;

          import org.apache.commons.betwixt.io.BeanWriter;

          public class BeanToXMLConverter {    
              
          private final static String FILE_PATH="c:/test.xml";
              
              
          /** 
               * Create an example bean and then convert it to xml.
               
          */
              
          public static final void main(String [] args) throws Exception {
                  Person person1
          =new Person();
                  person1.setName(
          "張三");
                  person1.setGender(
          "");
                  person1.setAge(
          35);
                  
                  Person person2
          =new Person();
                  person2.setName(
          "李四");
                  person2.setGender(
          "");
                  person2.setAge(
          25);
                  ArrayList
          <Person> al=new ArrayList<Person>();
                  al.add(person1);
                  al.add(person2);
                  
                  NameList nameList
          =new NameList();
                  nameList.setList(al);       
                  
          try{
                      BeanToXMLConverter wea
          =new BeanToXMLConverter();
                      wea.writeToXMLFile(nameList);
                  }
          catch(Exception e){
                      e.printStackTrace();
                  }
              }
              
              
          private void writeToXMLFile(Object obj)throws Exception{
                  StringWriter outputWriter 
          = new StringWriter();       
                  outputWriter.write(
          "<?xml version='1.0' ecoding='UTF-8' ?>\n");       
                  BeanWriter beanWriter 
          = new BeanWriter(outputWriter);       
                  beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(
          false);
                  beanWriter.getBindingConfiguration().setMapIDs(
          false);
                  beanWriter.enablePrettyPrint();

                  beanWriter.write(obj);
                  String xmlFilePath
          =FILE_PATH;
                  File xmlFile
          =new File(FILE_PATH);
                  
          if(!xmlFile.exists()){
                      xmlFile.createNewFile();
                  }
                  FileWriter fw
          =new FileWriter(xmlFilePath);
                  fw.write(outputWriter.toString().toCharArray());
                  fw.flush();
                  System.out.println(outputWriter.toString());
                  outputWriter.close();
              }
          }

               NameList類代碼。
           1 package com.blogjava.heis.jasper.chapter2;
           2 
           3 import java.util.List;
           4 
           5 public class NameList {
           6 
           7     private List<Person> list;
           8 
           9     public List<Person> getList() {
          10         return list;
          11     }
          12 
          13     public void setList(List<Person> list) {
          14         this.list = list;
          15     }
          16 }
          17 
                  運行以上的代碼需要四個包,commons-betwixt.jar,commons-logging.jar, commons-collections.jar, commons-beanutils-core.jar。這些都可以從http://commons.apache.org/下載。JDK需要1.5或以上。
                  看到這里你心里也許開始矛盾(或者不屑),對,同事Q也是這樣想的。
                Q:“這不是擺明更麻煩么?對象轉(zhuǎn)換為XML,再從XML查數(shù)據(jù),你這瞎折騰我,浪費資源在轉(zhuǎn)換上!!”
                俺:“也許是多了一些功夫,多占用了點資源。但是這可以讓報表的數(shù)據(jù)可讀性更強,更重要的是報表制作可以和SQL說拜拜,他和對象走得更密切了。”
                Q:“但是你的XML文件不是還是需要查詢么?你能保證那些查詢語句比SQL更簡單么?”
                俺:“我能給你肯定的回答。但是XML的查詢就要留到下一章去介紹了。這星期OT比較多,先溜啦,88。”
                Q:“哎,你給我說清楚點再走……”
               






          程序員的一生其實可短暫了,這電腦一開一關(guān),一天過去了,嚎;電腦一開不關(guān),那就成服務(wù)器了,嚎……

          posted on 2009-02-21 21:14 Heis 閱讀(3104) 評論(2)  編輯  收藏 所屬分類: JasperReport那些事兒

          評論

          # re: JasperReport那些事兒(二)——從對象到XML數(shù)據(jù)源  回復  更多評論   

          這樣確實解決了煩人的SQL但是增加了額外的負擔,fillReport你需要的數(shù)據(jù)源需要從xmlDatasource中加載,如果再來點統(tǒng)計、圖表型等等,scriplet也會讓你越來越頭疼,首先維護起來麻煩,其次為了填充obj大對象所帶來代碼額外的代碼、性能開銷......
          2009-02-23 08:55 | 凌晨風

          # re: JasperReport那些事兒(二)——從對象到XML數(shù)據(jù)源  回復  更多評論   

          如果相對于那些時常導出報表的,如在瀏覽器上導出報表的這確實一個很好的方案。
          但是還是搞不清如何解決查詢的問題,所以期待你的下一章。
          2009-02-25 09:44 | duduli
          主站蜘蛛池模板: 阆中市| 开原市| 陵水| 崇州市| 汪清县| 沈阳市| 清镇市| 军事| 府谷县| 靖西县| 穆棱市| 梧州市| 永登县| 中方县| 朝阳县| 清涧县| 长乐市| 菏泽市| 体育| 武汉市| 湾仔区| 霞浦县| 镇安县| 铁岭县| 盐源县| 容城县| 余姚市| 北辰区| 乐清市| 招远市| 奉节县| 思南县| 噶尔县| 德令哈市| 长乐市| 南靖县| 图们市| 获嘉县| 上饶市| 望奎县| 泾川县|