十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章主要介紹“Java怎么連接程序數(shù)據(jù)源”,在日常操作中,相信很多人在Java怎么連接程序數(shù)據(jù)源問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java怎么連接程序數(shù)據(jù)源”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、昭化網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5技術(shù)、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為昭化等各大城市提供網(wǎng)站開發(fā)制作服務。
在實際應用中,可能需要根據(jù)表名動態(tài)地改變數(shù)據(jù)源,比如在程序數(shù)據(jù)集中,通過傳進的表名參數(shù),到數(shù)據(jù)庫取出對應的表作為數(shù)據(jù)源。例如,F(xiàn)ineReport是通過AbstractTableData抽象類來讀取數(shù)據(jù)源的,而上述所有的數(shù)據(jù)來源都繼承實現(xiàn)其抽象方法,因此用戶只要實現(xiàn)了AbstractTableData抽象類,也就可以用自定義類型的數(shù)據(jù)源了(程序數(shù)據(jù)集),這是帶參程序數(shù)據(jù)集連接的方法。
FineReport報表引擎就能夠讀取定義的數(shù)據(jù)源作為報表數(shù)據(jù)源使用,原理就是繼承AbstractTableData。
1、定義參數(shù)
定義一個參數(shù),并定義數(shù)據(jù)表結(jié)構(gòu),代碼如下:
public ParamTableDataDemo() { // 定義tableName參數(shù) this.parameters = new Parameter[] { new Parameter("tableName") }; // 定義程序數(shù)據(jù)集列名 columnNames = new String[columnNum]; for (int i = 0; i < columnNum; i++) { columnNames[i] = "column#" + String.valueOf(i); } }
2、設置數(shù)據(jù)
將數(shù)據(jù)放入到定義的表中,代碼如下:
public void init() { // 確保只被執(zhí)行一次 if (valueList != null) { return; } // 保存得到的數(shù)據(jù)庫表名 String tableName = parameters[0].getValue().toString(); // 構(gòu)造SQL語句,并打印出來 String sql = "select * from " + tableName + ";"; FRContext.getLogger().info("Query SQL of ParamTableDataDemo: \n" + sql); // 保存得到的結(jié)果集 valueList = new ArrayList(); // 下面開始建立數(shù)據(jù)庫連接,按照剛才的SQL語句進行查詢 Connection conn = this.getConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); // 獲得記錄的詳細信息,然后獲得總列數(shù) ResultSetMetaData rsmd = rs.getMetaData(); colNum = rsmd.getColumnCount(); // 用對象保存數(shù)據(jù) Object[] objArray = null; while (rs.next()) { objArray = new Object[colNum]; for (int i = 0; i < colNum; i++) { objArray[i] = rs.getObject(i + 1); } // 在valueList中加入這一行數(shù)據(jù) valueList.add(objArray); } // 釋放數(shù)據(jù)庫資源 rs.close(); stmt.close(); conn.close(); // 打印一共取到的數(shù)據(jù)行數(shù)量 FRContext.getLogger().info( "Query SQL of ParamTableDataDemo: \n" + valueList.size() + " rows selected"); } catch (Exception e) { e.printStackTrace(); } }
3、完整的數(shù)據(jù)集代碼
整的帶參程序數(shù)據(jù)集的代碼如下
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 { // 列名數(shù)組,保存程序數(shù)據(jù)集所有列名 private String[] columnNames = null; // 定義程序數(shù)據(jù)集的列數(shù)量 private int columnNum = 10; // 保存查詢表的實際列數(shù)量 private int colNum = 0; // 保存查詢得到列值 private ArrayList valueList = null; // 構(gòu)造函數(shù),定義表結(jié)構(gòu),該表有10個數(shù)據(jù)列,列名為column#0,column#1,。。。。。。column#9 public ParamTableDataDemo() { // 定義tableName參數(shù) setDefaultParameters(new Parameter[] { new Parameter("tableName") }); // 定義程序數(shù)據(jù)集列名 columnNames = new String[columnNum]; for (int i = 0; i < columnNum; i++) { columnNames[i] = "column#" + String.valueOf(i); } } // 實現(xiàn)其他四個方法 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]; } // 準備數(shù)據(jù) public void init() { // 確保只被執(zhí)行一次 if (valueList != null) { return; } // 保存得到的數(shù)據(jù)庫表名 String tableName = parameters[0].getValue().toString(); // 構(gòu)造SQL語句,并打印出來 String sql = "select * from " + tableName + ";"; FRContext.getLogger().info("Query SQL of ParamTableDataDemo: \n" + sql); // 保存得到的結(jié)果集 valueList = new ArrayList(); // 下面開始建立數(shù)據(jù)庫連接,按照剛才的SQL語句進行查詢 Connection conn = this.getConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); // 獲得記錄的詳細信息,然后獲得總列數(shù) ResultSetMetaData rsmd = rs.getMetaData(); colNum = rsmd.getColumnCount(); // 用對象保存數(shù)據(jù) Object[] objArray = null; while (rs.next()) { objArray = new Object[colNum]; for (int i = 0; i < colNum; i++) { objArray[i] = rs.getObject(i + 1); } // 在valueList中加入這一行數(shù)據(jù) valueList.add(objArray); } // 釋放數(shù)據(jù)庫資源 rs.close(); stmt.close(); conn.close(); // 打印一共取到的數(shù)據(jù)行數(shù)量 FRContext.getLogger().info( "Query SQL of ParamTableDataDemo: \n" + valueList.size() + " rows selected"); } catch (Exception e) { e.printStackTrace(); } } // 獲取數(shù)據(jù)庫連接 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; } // 釋放一些資源,因為可能會有重復調(diào)用,所以需釋放valueList,將上次查詢的結(jié)果釋放掉 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下面。此時該程序數(shù)據(jù)源便定義好了。
4、配置程序數(shù)據(jù)集
新建報表,在報表數(shù)據(jù)集中新建程序數(shù)據(jù)源,選擇我們定義好的程序數(shù)據(jù)集,如下圖,名字可以自定義,如divtable
5、使用程序數(shù)據(jù)集
配置好程序數(shù)據(jù)源后便可以使用定義的程序數(shù)據(jù)集了,選中該數(shù)據(jù)集點擊預覽
按鈕,即可以輸入表名動態(tài)地獲取相應的數(shù)據(jù)表,并制作模板,如下圖
如果預覽不出數(shù)據(jù),請確認代碼段里面定義數(shù)據(jù)庫連接時URL的地址是否正確。
可以看到,STSCORE表中的數(shù)據(jù)已經(jīng)提取至程序數(shù)據(jù)集表中,像其他類型的數(shù)據(jù)集一樣,可以通過拖拽方法實現(xiàn)單元格數(shù)據(jù)列綁定。
到此,關(guān)于“Java怎么連接程序數(shù)據(jù)源”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
當前題目:Java怎么連接程序數(shù)據(jù)源
文章起源:http://m.jiaotiyi.com/article/jgjeid.html