在实际应用中,可能需要根据表名动态地改变数据源,比如在程序数据集中,通过传进的表名参数,到数据库取出对应的表作为数据源。例如,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连接数据库的过程主要涉及到数据源(DataSource)的建立,这是Java应用程序与数据库交互的重要环节。在本场景中,我们以Windows环境下的Web服务器为例,详细解释如何通过ODBC(Open Database Connectivity)数据...
数据源(DataSource)是Java中用于获取数据库连接的标准接口,而连接池则是一种管理数据库连接的机制,它预先创建一定数量的数据库连接并将它们存储在一个池中,供应用程序重复使用。这种方式可以显著减少创建和销毁...
Java连接DB2数据源的例子,演示Java加载驱动程序,执行此例子需要调用newInstance() 注意JDK 1.1.1以下版本 在 OS/2上不具备Class.forName() 方法 执行静态初始化,可以忽略调用.
Java Web JDBC 数据源是指在 Java Web 应用程序中使用 JDBC(Java Database Connectivity)技术来连接数据库的方式。在这个配置文件中,我们可以看到的是在 Tomcat 中的 conf 文件下,配置了一个 Context 构件,用于...
在Java开发中,多数据源是指应用程序需要连接和操作多个不同的数据库。这通常发生在大型系统中,例如,可能需要一个数据库来存储用户信息,另一个数据库处理订单,还可能有第三个数据库用于日志记录。Spring Boot...
在Java开发过程中,数据源(DataSource)扮演着非常重要的角色,它负责管理数据库连接资源,为应用程序提供高效、可靠的数据库访问支持。`javax.sql.DataSource`接口定义了标准的数据源接口规范,不同的实现方式能够...
在本案例中,我们关注的是通过ODBC(Open Database Connectivity)数据源来实现Java的数据库连接。ODBC是一种标准的API,它允许应用程序通过一个统一的接口访问多种不同类型的数据库系统。 首先,我们需要理解Java...
【Java语言程序设计源代码】这个资源集合涵盖了Java编程的基础到高级应用,是学习和实践Java编程的理想素材。从描述中我们可以看出,这份资源包括了从基础语法到窗体程序设计,再到数据库连接等多个关键领域,每个...
在Java开发中,数据源(DataSource)是连接数据库的关键组件,它管理数据库连接,提供高效、安全的数据库访问。在本篇文章中,我们将深入探讨Java数据源配置,特别是在Tomcat服务器中的应用。 首先,理解数据源的...
在Java开发中,多数据源共存是一种常见的需求,特别是在大型企业级应用或者分布式系统中。这涉及到如何在同一个应用程序中有效地管理和切换不同的数据库连接,以实现数据的隔离或者负载均衡。以下是对这一主题的详细...
在Spring框架中,通过JNDI(Java Naming and Directory Interface)可以方便地访问WebLogic服务器中的数据源。这为应用程序提供了高度解耦的数据访问机制,使得应用程序能够更加灵活地管理与数据库的连接。本文将...
在Java开发中,多数据源是指应用程序能够连接和操作多个不同的数据库,这在大型系统或者分布式环境中非常常见。为了实现这种功能,开发者通常会利用框架如SpringMVC,结合ORM框架如MyBatis或Hibernate来处理数据访问...
"java简单实例程序源代码"这个压缩包包含了一系列章节相关的Java实例源代码,适合初学者和有经验的开发者用来加深对Java语言的理解。以下是这些章节可能涉及的重要知识点的详细解释: 1. **CH11**: 这个章节可能...
标题《java连接HighGo DB》所要阐述的知识点主要集中在Java程序中如何连接到HighGo数据库。HighGo数据库是由瀚高基础软件股份有限公司开发的一款高性能、稳定可靠的数据库系统。在Java中进行数据库操作,通常需要...
Java数据源配置包JNDI,是Java应用程序与数据库交互的一种常见方式,特别是在服务器环境中,如Tomcat。JNDI(Java Naming and Directory Interface)是一个Java API,它允许应用程序查找和管理分布式环境中的资源,...
《Java语言程序设计》是一本深入讲解Java编程的教材,其源代码是学习者实践编程、理解Java语言特性和编程技巧的重要资源。本压缩包包含了该书中的所有示例程序和练习题的源代码,旨在帮助读者通过实际操作加深对Java...
在Java开发中,多数据源是指应用程序可以同时连接并操作多个不同的数据库。这种技术在大型系统中非常常见,比如在需要实现数据隔离、读写分离、分库分表等复杂需求时,多数据源就显得尤为重要。Spring、SpringMVC和...
这个“经典java小程序源代码合集”是为Java初学者准备的宝贵资源,它包含了一系列在学习过程中可能会遇到的经典示例,有助于深入理解Java语言的核心概念。 首先,让我们探讨Java的基础知识。Java程序由类(class)...
在Java Web开发中,JNDI(Java Naming and Directory Interface)是一个重要的标准接口,它允许应用程序查找和使用各种资源,包括数据源(Datasource)。数据源是管理数据库连接的组件,能够有效地处理数据库连接的...
在Java开发中,多数据源是指应用程序连接到多个数据库以实现不同的业务需求。这通常发生在分布式系统、微服务架构或需要隔离不同业务数据的情况下。在本主题中,我们将深入探讨如何利用Spring AOP(面向切面编程)...