wuxiren123

          Java連接程序數據源

          在實際應用中,可能需要根據表名動態地改變數據源,比如在程序數據集中,通過傳進的表名參數,到數據庫取出對應的表作為數據源。例如,FineReport是通過AbstractTableData抽象類來讀取數據源的,而上述所有的數據來源都繼承實現其抽象方法,因此用戶只要實現了AbstractTableData抽象類,也就可以用自定義類型的數據源了(程序數據集),這是帶參程序數據集連接的方法。

          FineReport報表引擎就能夠讀取定義的數據源作為報表數據源使用,原理就是繼承AbstractTableData。

          1、定義參數

          定義一個參數,并定義數據表結構,代碼如下:

          public ParamTableDataDemo() {  
                  
          // 定義tableName參數  
                  this.parameters = new Parameter[] new Parameter("tableName") };  
                  
          // 定義程序數據集列名  
                  columnNames = new String[columnNum];  
                  
          for (int i = 0; i < columnNum; i++{  
                      columnNames[i] 
          = "column#" + String.valueOf(i);  
                  }
            
          }


          2、設置數據

          將數據放入到定義的表中,代碼如下:

          public void init() {
                  
          // 確保只被執行一次
                  if (valueList != null{
                      
          return;
                  }

                  
          // 保存得到的數據庫表名
                  String tableName = parameters[0].getValue().toString();
                  
          // 構造SQL語句,并打印出來
                  String sql = "select * from " + tableName + ";";
                  FRContext.getLogger().info(
          "Query SQL of ParamTableDataDemo: \n" + sql);
                  
          // 保存得到的結果集
                  valueList = new ArrayList();
                  
          // 下面開始建立數據庫連接,按照剛才的SQL語句進行查詢
                  Connection conn = this.getConnection();
                  
          try {
                      Statement stmt 
          = conn.createStatement();
                      ResultSet rs 
          = stmt.executeQuery(sql);
                      
          // 獲得記錄的詳細信息,然后獲得總列數
                      ResultSetMetaData rsmd = rs.getMetaData();
                      colNum 
          = rsmd.getColumnCount();
                      
          // 用對象保存數據
                      Object[] objArray = null;
                      
          while (rs.next()) {
                          objArray 
          = new Object[colNum];
                          
          for (int i = 0; i < colNum; i++{
                              objArray[i] 
          = rs.getObject(i + 1);
                          }

                          
          // 在valueList中加入這一行數據
                          valueList.add(objArray);
                      }

                      
          // 釋放數據庫資源
                      rs.close();
                      stmt.close();
                      conn.close();
                      
          // 打印一共取到的數據行數量
                      FRContext.getLogger().info(
                              
          "Query SQL of ParamTableDataDemo: \n" + valueList.size()
                                      
          + " rows selected");
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

              }






          3、完整的數據集代碼

          整的帶參程序數據集的代碼如下

          package com.fr.data;

          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.ResultSet;
          import java.sql.ResultSetMetaData;
          import java.sql.Statement;
          import java.util.ArrayList;

          import com.fr.base.Env;
          import com.fr.base.FRContext;
          import com.fr.data.AbstractTableData;
          import com.fr.base.Parameter;

          public class ParamTableDataDemo extends AbstractTableData {
              
          // 列名數組,保存程序數據集所有列名
              private String[] columnNames = null;
              
          // 定義程序數據集的列數量
              private int columnNum = 10;
              
          // 保存查詢表的實際列數量
              private int colNum = 0;
              
          // 保存查詢得到列值
              private ArrayList valueList = null;

              
          // 構造函數,定義表結構,該表有10個數據列,列名為column#0,column#1,。。。。。。column#9
              public ParamTableDataDemo() {
                  
          // 定義tableName參數
                  setDefaultParameters(new Parameter[] new Parameter("tableName") });
                  
          // 定義程序數據集列名
                  columnNames = new String[columnNum];
                  
          for (int i = 0; i < columnNum; i++{
                      columnNames[i] 
          = "column#" + String.valueOf(i);
                  }

              }


              
          // 實現其他四個方法
              public int getColumnCount() {
                  
          return columnNum;
              }


              
          public String getColumnName(int columnIndex) {
                  
          return columnNames[columnIndex];
              }


              
          public int getRowCount() {
                  init();
                  
          return valueList.size();
              }


              
          public Object getValueAt(int rowIndex, int columnIndex) {
                  init();
                  
          if (columnIndex >= colNum) {
                      
          return null;
                  }

                  
          return ((Object[]) valueList.get(rowIndex))[columnIndex];
              }


              
          // 準備數據
              public void init() {
                  
          // 確保只被執行一次
                  if (valueList != null{
                      
          return;
                  }

                  
          // 保存得到的數據庫表名
                  String tableName = parameters[0].getValue().toString();
                  
          // 構造SQL語句,并打印出來
                  String sql = "select * from " + tableName + ";";
                  FRContext.getLogger().info(
          "Query SQL of ParamTableDataDemo: \n" + sql);
                  
          // 保存得到的結果集
                  valueList = new ArrayList();
                  
          // 下面開始建立數據庫連接,按照剛才的SQL語句進行查詢
                  Connection conn = this.getConnection();
                  
          try {
                      Statement stmt 
          = conn.createStatement();
                      ResultSet rs 
          = stmt.executeQuery(sql);
                      
          // 獲得記錄的詳細信息,然后獲得總列數
                      ResultSetMetaData rsmd = rs.getMetaData();
                      colNum 
          = rsmd.getColumnCount();
                      
          // 用對象保存數據
                      Object[] objArray = null;
                      
          while (rs.next()) {
                          objArray 
          = new Object[colNum];
                          
          for (int i = 0; i < colNum; i++{
                              objArray[i] 
          = rs.getObject(i + 1);
                          }

                          
          // 在valueList中加入這一行數據
                          valueList.add(objArray);
                      }

                      
          // 釋放數據庫資源
                      rs.close();
                      stmt.close();
                      conn.close();
                      
          // 打印一共取到的數據行數量
                      FRContext.getLogger().info(
                              
          "Query SQL of ParamTableDataDemo: \n" + valueList.size()
                                      
          + " rows selected");
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

              }


              
          // 獲取數據庫連接 driverName和 url 可以換成您需要的
              public Connection getConnection() {
                  
                  String driverName 
          = "org.sqlite.JDBC";
                  String url 
          = "jdbc:sqlite://D:\\FineReport_8.0\\WebReport\\FRDemo.db";
                  String username 
          = "";
                  String password 
          = "";
                  Connection con 
          = null;
                  
          try {
                      Class.forName(driverName);
                      con 
          = DriverManager.getConnection(url, username, password);
                  }
           catch (Exception e) {
                      e.printStackTrace();
                      
          return null;
                  }

                  
          return con;
              }


              
          // 釋放一些資源,因為可能會有重復調用,所以需釋放valueList,將上次查詢的結果釋放掉
              public void release() throws Exception {
                  
          super.release();
                  
          this.valueList = null;
              }

          }




          編譯ParamTableDataDemo.java ,將生成的ParamTableDataDemo.class類文件拷貝到報表工程/WEB-INF/classes目錄下。由于該類是在com.fr.data包中的,因此最終應該將該類放在/WEB-INF/classes/com/fr/data下面。此時該程序數據源便定義好了。

          4、配置程序數據集

          新建報表,在報表數據集中新建程序數據源,選擇我們定義好的程序數據集,如下圖,名字可以自定義,如divtable

          5、使用程序數據集

          配置好程序數據源后便可以使用定義的程序數據集了,選中該數據集點擊預覽

          按鈕,即可以輸入表名動態地獲取相應的數據表,并制作模板,如下圖


          如果預覽不出數據,請確認代碼段里面定義數據庫連接時URL的地址是否正確。

          可以看到,STSCORE表中的數據已經提取至程序數據集表中,像其他類型的數據集一樣,可以通過拖拽方法實現單元格數據列綁定。

          posted on 2016-08-01 11:16 喝水居然長肉 閱讀(101) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 威海市| 宿迁市| 外汇| 鞍山市| 甘肃省| 苍南县| 凤翔县| 固阳县| 西华县| 广元市| 察哈| 繁峙县| 霞浦县| 栖霞市| 高安市| 静安区| 张家港市| 吉林省| 武功县| 宝鸡市| 安阳县| 江源县| 景谷| 内江市| 磐石市| 峨眉山市| 宜君县| 滨海县| 隆昌县| 建平县| 六盘水市| 龙南县| 雷山县| 姜堰市| 汉寿县| 千阳县| 宜兰县| 苏尼特左旗| 郧西县| 五莲县| 涟源市|