这篇文章主要介绍“Java怎么连接程序数据源”,在日常操作中,相信很多人在Java怎么连接程序数据源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么连接程序数据源”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在实际应用中,可能需要根据表名动态地改变数据源,比如在程序数据集中,通过传进的表名参数,到数据库取出对应的表作为数据源。例如,FineReport是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此用户只要实现了AbstractTableData抽象类,也就可以用自定义类型的数据源了(程序数据集),这是带参程序数据集连接的方法。

FineReport报表引擎就能够读取定义的数据源作为报表数据源使用,原理就是继承AbstractTableData。

1、定义参数

定义一个参数,并定义数据表结构,代码如下:

publicParamTableDataDemo(){//定义tableName参数this.parameters=newParameter[]{newParameter("tableName")};//定义程序数据集列名columnNames=newString[columnNum];for(inti=0;i<columnNum;i++){columnNames[i]="column#"+String.valueOf(i);}}

2、设置数据

将数据放入到定义的表中,代码如下:

publicvoidinit(){//确保只被执行一次if(valueList!=null){return;}//保存得到的数据库表名StringtableName=parameters[0].getValue().toString();//构造SQL语句,并打印出来Stringsql="select*from"+tableName+";";FRContext.getLogger().info("QuerySQLofParamTableDataDemo:\n"+sql);//保存得到的结果集valueList=newArrayList();//下面开始建立数据库连接,按照刚才的SQL语句进行查询Connectionconn=this.getConnection();try{Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);//获得记录的详细信息,然后获得总列数ResultSetMetaDatarsmd=rs.getMetaData();colNum=rsmd.getColumnCount();//用对象保存数据Object[]objArray=null;while(rs.next()){objArray=newObject[colNum];for(inti=0;i<colNum;i++){objArray[i]=rs.getObject(i+1);}//在valueList中加入这一行数据valueList.add(objArray);}//释放数据库资源rs.close();stmt.close();conn.close();//打印一共取到的数据行数量FRContext.getLogger().info("QuerySQLofParamTableDataDemo:\n"+valueList.size()+"rowsselected");}catch(Exceptione){e.printStackTrace();}}

3、完整的数据集代码

整的带参程序数据集的代码如下

packagecom.fr.data;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.Statement;importjava.util.ArrayList;importcom.fr.base.Env;importcom.fr.base.FRContext;importcom.fr.data.AbstractTableData;importcom.fr.base.Parameter;publicclassParamTableDataDemoextendsAbstractTableData{//列名数组,保存程序数据集所有列名privateString[]columnNames=null;//定义程序数据集的列数量privateintcolumnNum=10;//保存查询表的实际列数量privateintcolNum=0;//保存查询得到列值privateArrayListvalueList=null;//构造函数,定义表结构,该表有10个数据列,列名为column#0,column#1,。。。。。。column#9publicParamTableDataDemo(){//定义tableName参数setDefaultParameters(newParameter[]{newParameter("tableName")});//定义程序数据集列名columnNames=newString[columnNum];for(inti=0;i<columnNum;i++){columnNames[i]="column#"+String.valueOf(i);}}//实现其他四个方法publicintgetColumnCount(){returncolumnNum;}publicStringgetColumnName(intcolumnIndex){returncolumnNames[columnIndex];}publicintgetRowCount(){init();returnvalueList.size();}publicObjectgetValueAt(introwIndex,intcolumnIndex){init();if(columnIndex>=colNum){returnnull;}return((Object[])valueList.get(rowIndex))[columnIndex];}//准备数据publicvoidinit(){//确保只被执行一次if(valueList!=null){return;}//保存得到的数据库表名StringtableName=parameters[0].getValue().toString();//构造SQL语句,并打印出来Stringsql="select*from"+tableName+";";FRContext.getLogger().info("QuerySQLofParamTableDataDemo:\n"+sql);//保存得到的结果集valueList=newArrayList();//下面开始建立数据库连接,按照刚才的SQL语句进行查询Connectionconn=this.getConnection();try{Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);//获得记录的详细信息,然后获得总列数ResultSetMetaDatarsmd=rs.getMetaData();colNum=rsmd.getColumnCount();//用对象保存数据Object[]objArray=null;while(rs.next()){objArray=newObject[colNum];for(inti=0;i<colNum;i++){objArray[i]=rs.getObject(i+1);}//在valueList中加入这一行数据valueList.add(objArray);}//释放数据库资源rs.close();stmt.close();conn.close();//打印一共取到的数据行数量FRContext.getLogger().info("QuerySQLofParamTableDataDemo:\n"+valueList.size()+"rowsselected");}catch(Exceptione){e.printStackTrace();}}//获取数据库连接driverName和url可以换成您需要的publicConnectiongetConnection(){StringdriverName="org.sqlite.JDBC";Stringurl="jdbc:sqlite://D:\\FineReport_8.0\\WebReport\\FRDemo.db";Stringusername="";Stringpassword="";Connectioncon=null;try{Class.forName(driverName);con=DriverManager.getConnection(url,username,password);}catch(Exceptione){e.printStackTrace();returnnull;}returncon;}//释放一些资源,因为可能会有重复调用,所以需释放valueList,将上次查询的结果释放掉publicvoidrelease()throwsException{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怎么连接程序数据源”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!