千家信息网

Java怎么连接程序数据源

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍"Java怎么连接程序数据源",在日常操作中,相信很多人在Java怎么连接程序数据源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java怎么连接程序数
千家信息网最后更新 2026年11月04日Java怎么连接程序数据源

这篇文章主要介绍"Java怎么连接程序数据源",在日常操作中,相信很多人在Java怎么连接程序数据源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"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表中的数据已经提取至程序数据集表中,像其他类型的数据集一样,可以通过拖拽方法实现单元格数据列绑定。

到此,关于"Java怎么连接程序数据源"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

数据 程序 数据源 数据库 代码 参数 报表 查询 数量 方法 语句 学习 结果 资源 一行 信息 动态 实际 对象 数据表 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 互联网科技公司经营范围 国智互联网科技 互联网科技官网 中国互联网科技股 深圳互联网科技公司 鑫亿盛互联网科技 有木互联网科技 互联网科技公司有哪些 西藏七维空间互联网科技有限公司 常德市电业局互联网科技部 茂名市互联网科技产业园 成都铂石互联网科技做什么的 花神(南京)互联网科技有限公司 青海科技产业互联网发展 广州新华互联网科技学校电竞方面 西安小鹰速贷互联网科技有限公司 中和天地互联网科技有限公司 重庆科技产业互联网有哪些 上海旺乐尼互联网科技有限公司 互联网科技有限公司 互联网科技股 关于新基建和互联网科技 互联网科技汛 上海亿帐通互联网科技 互联网教育科技公司vipkid 浙江互联网科技研学营 上海科技产业互联网平台 黑科技 体验场景 互联网大会 银行科技岗属于互联网吗
0