Java连接程序数据源

来源:互联网 发布:nginx无法访问图片 编辑:程序博客网 时间:2024/05/14 23:20

在实际应用中,可能需要根据表名动态地改变数据源,比如在程序数据集中,通过传进的表名参数,到数据库取出对应的表作为数据源。例如,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#9public 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表中的数据已经提取至程序数据集表中,像其他类型的数据集一样,可以通过拖拽方法实现单元格数据列绑定。


15 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微博账号密码都忘了怎么办 新浪博客忘记邮箱和密码忘了怎么办 新浪助学贷款邮箱密码忘了怎么办 客厅的父母乐忘记密码了怎么办 微博密码忘记了手机号也换了怎么办 想改密码旧密码忘了怎么办 商标转让转让方不配合做补证怎么办 肇事后责任方拒赔怎么办久草www 我出车祸了对方逃逸找不到人怎么办 肇事车辆怀疑是故意伤人怎么办啊 法院判的交通事故罚金没钱交怎么办 公安抓人应该行政拘留却放了怎么办 停车场把人家车刮了跑了后怕怎么办 膝盖半月板损伤可走路不疼怎么办 面试过程中遇到写的笔没水怎么办 当学生会主席底下的人不服怎么办 中班学生放学总是不写作业怎么办 妻子不想离婚主动同认婚外情怎么办 淘宝自动退款超时了卖家怎么办 征途盟战刺探自己盟的没做怎么办 被蜜蜂蛰了但一周后奇痒怎么办 热带鱼小鱼抢食大鱼吃不到怎么办 家里养的植物土壤里有虫子怎么办 哺乳期乳房有硬块乳头有白点怎么办 税务查税拿到不开票销售合同怎么办 买地皮是集体证已交钱了怎么办 word里的字体都是英文版怎么办 华为手机开机卡在菊花那里怎么办 车辆挂牌时公司名称打错了怎么办 经营异常名录查不到怎么办移除 企业被列入经营税务异常名录怎么办 手机号被别人绑定了企业微信怎么办 刚出生一天的婴儿不肯吃奶怎么办 9个月孩子不好好吃奶怎么办 孩子2个月吃奶老是呛到怎么办 孩子4个月不好好吃奶怎么办? 3个月的孩子不吃奶肚子胀怎么办 刚出生的婴儿吃完奶打嗝怎么办 宝宝刚生下来一直睡觉不吃奶怎么办 刚生下来的婴儿不吃奶怎么办 刚生下来的小猫不吃奶怎么办