3.8 Excel数据源
新建Excel Data Source,取名Excel _birt,
把要当做数据源的excel放置到同一个工程下,注意excel必须是单一的表格,不是包含嵌套表格或者图表的表格,但可以包括多个sheet。
创建数据集,选择一个sheet,并选择需要作为数据集的属性列:
定义相应的格式:
预览结果:
则该数据源建立完毕。其它的配置同平面文件数据源。
3.9 profile数据源
在JAVA EE的视图打开窗口,选择Database Development视图,我们在这个视图的Database Development窗口,创建profile数据源
则该数据源建立完毕。其它的配置同平面文件数据源。
把Connection URL复制到ODA数据源新建的JDBC数据源的编辑框中,取名birt_demo2
测试连接完成。
切换到BIRT 数据资源管理器,新建数据源,选择从profile store中获取数据源,下一步,如果已经建立过则直接从项目文档中选取
否则就新建一个
示例数据库的profile数据源的建立过程同下图所示
切换到birt数据资源管理器新建数据源-从profile store中获取
由于profile数据源文件可以复制,所以我们可以把一个工程中的数据源复制到另一个工程中,然后在birt中用从profile中创建数据源的方式创建数据源,这样就避免了数据源的重复建设。后文中还会讲到如何在一个工程中使用公共数据源。
3.10 在BIRT中访问Hibernate POJO
1.概述
BIRT是基于Eclipse的开源报表平台,特别适合于Java/J2EE Web应用程序。
本文演示如何通过BIRT脚本数据源(Scripted Data Source)访问Hibernate POJOs(Plain Old Java Objects)。关于Hibernate,可参考http://www.hibernate.org 。
使用的BIRT版本为2.3.1,Hibernate版本为3.3.1.GA。
2.问题描述
一家名为“Classic Models”的公司(经典汽车模型零售商)决定采用ORM(Object-relational mapping)改进它的一个现有应用系统以增强其可维护性。
ORM选用Hibernate;原来通过JDBC数据源直连后台MySQL数据库、执行SQL提取数据的BIRT报表要修改为从Hibernate获取数据。
3.Hibernate相关准备
为使大家有一个共同的演示数据库,将BIRT示例数据库“ClassicModels”导入到MySQL,作为该公司的数据库。具体导入步骤,请参考:http://www.eclipse.org/birt/phoenix/db/#mysql。
以数据库中一个名为“customers”的表为例,先编写与之对应的POJO类:
package net.roger.hibernatedemo.model;
public class Customer
{
private int customerNumber;
private String customerName;
private String contactLastName;
private String contactFirstName;
private String phone;
private String addressLine1;
private String addressLine2;
private String city;
private String state;
private String postalCode;
private String country;
private Integer salesRepEmployeeNumber;
private double creditLimit;
/**
* @return the customerNumber
*/
public int getCustomerNumber( )
{
return customerNumber;
}
/**
* @param customerNumber the customerNumber to set
*/
public void setCustomerNumber( int customerNumber )
{
this.customerNumber = customerNumber;
}
//other getters and setters
.
.
.
再提供其Hibernate 映射文件Customer.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="net.roger.hibernatedemo.model.Customer" table="customers">
<id name="customerNumber" column="customerNumber">
<generator class="native"/>
</id>
<property name="customerName"/>
<property name="contactLastName"/>
<property name="contactFirstName"/>
<property name="phone"/>
<property name="addressLine1"/>
<property name="addressLine2"/>
<property name="city"/>
<property name="state"/>
<property name="postalCode"/>
<property name="country"/>
<property name="salesRepEmployeeNumber"/>
<property name="creditLimit"/>
</class>
</hibernate-mapping>
然后,提供Hibernate配置文件hibernate.cfg.xml以定义如何连接后台MySQL数据库及列出所有映射文件等,如下所示:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://spmdb/ClassicModels</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<mapping resource="net/roger/hibernatedemo/model/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
至此,Hibernate相关映射及配置工作完成。
下一步,编写一个CustomerList类,它的如下所示的listCustomers( )方法负责根据传入的HQL 语句通过Hibernate返回一个存有Customer实例的列表:
public List listCustomer( String hql )
{
Session hSession = HibernateUtil.getSessionFactory( ).getCurrentSession( );
hSession.beginTransaction( );
List result = hSession.createQuery( hql ).list( );
hSession.getTransaction( ).commit( );
return result;
}
上述listCustomers( )中的HibernateUtil类改自Hibernate官方教程中提供的同名类http://www.hibernate.org/hib_docs/v3/reference/en-US/html/tutorial-firstapp.html#tutorial-firstapp-helpers,用于方便获取Hinernate会话(Session)。
listCustomers( )方法的参数“hql”代表一个HQL查询语句,稍后你将看到,其具体值将由BIRT传入。
将Hibernate Jar包、MySQL JDBC驱动mysql-connector-java-3.1.10-bin.jar及与Hibernate.3.3.1.GA匹配的slf4j-jdk14-1.5.2.jar(可从http://www.slf4j.org下载)添加到工程的classpath。该工程各文件布局如下图所示:
可以编写一个简单测试方法,用于检测CustomerList的listCustomer( )方法是否正常工作,如下所示:
CustomerList cl = new CustomerList( );
List<Customer> customers = cl.listCustomer( "from Customer" );
for ( Customer c : customers )
{
System.out.print( "Number: " + c.getCustomerNumber( ) + "; ");
System.out.println( "Name: " + c.getCustomerName( ) );
}
HibernateUtil.getSessionFactory( ).close( );
其运行结果为:
Number: 103; Name: Atelier graphique
Number: 112; Name: Signal Gift Stores
Number: 114; Name: Australian Collectors, Co.
Number: 119; Name: La Rochelle Gifts
Number: 121; Name: Baane Mini Imports
Number: 124; Name: Mini Gifts Distributors Ltd.
Number: 125; Name: Havel & Zbyszek Co
Number: 128; Name: Blauer See Auto, Co.
Number: 129; Name: Mini Wheels Co.
.
.
.
4.制作BIRT报表
下面演示如何在BIRT中通过脚本数据源(Scripted Data Source)访问CumtomerList、获取Customer实例列表。
首先,将上述工程的编译结果及Customer.hbm.xml和hibernate.cfg.xml按在工程中的目录结构打包成hibernateDemo.jar。
再将hibernateDemo.jar、Hiberante Jar包,MySQL驱动及slf4j-jdk14-1.5.2.jar复制到BIRT的\\plugins\org.eclipse.birt.report.viewer_XXX\birt\scriptlib目录下(“XXX”为版本号):
至此,就可以在BIRT中编写访问CustomerList和Customer类的脚本了。
假设要制作一份列出所有Customer的报表。首先创建一个名为“Hibernate”的脚本数据源:
再创建一个基于“Hibernate”数据源的脚本数据集“customersFromHibernate”:
点击“Next >”开始添加该数据集的输出列,如下图所示:
点击“Finish”完成该数据集的创建。
在“Data Explorer”下,选中“customersFromHibernate”数据集,在右侧主页面下方选择“Script”,再选择“open”函数,输入如下脚本:
然后,选择“fetch”函数,输入如下脚本:
之后,选择“close”函数,输入如下脚本:
至此,“customersFromHibernate”数据集编辑完毕,你可以预览它的数据结果,如下图所示:
如果你想使该数据集只返回特定条件的Customer,你可以为该数据集添加相应“Filter”,如下图所示:
你也可以通过修改其“open”函数的脚本,达到同样的效果,如:
总结
完整的演示了如何通过BIRT脚本数据源访问Hibernate POJO。必须注意到,在示例报表中,为简单起见,每当“customersFromHibernate”数据集的open()被调用时都去新建一个Hibernate SessionFactory,而当它的close()被调用时则去关闭该SessionFactory。在实际应用项目中,Hibernate的启停及会话管理完全可以在应用程序处理,而应用程序只需要暴露给BIRT一个POJO提供类,以使得在BIRT中可以编写脚本从之获取POJO即可。
由BIRT脚本数据源可以制作任何数据来自Java POJO的报表。
3.11 birt script数据源pojo配置
1、建立一个java project,作为pojo待用,本例中有两个java文件:
2、建立Report Project,在其中新建report,然后在Data Explorer中新建Data Sources,数据源类型选择scripted data source,如下图所示:
点击完成。
3、 新建Data Sets,选择Data Source Name如图所示:
1) 点击Next设置列名、数据类型、显示名称,如图所示:
4、 编写数据访问脚本
在Data Sets中选择我们建立的数据集,然后在报表编辑视图选择Script,分别编辑open和fetch,如图所示:
1) Open脚本
2) Fetch脚本
设计视图,在视图中选择layout,简单的将我们建立的data set拖到报表视图中即可,完成这步以后可以在preview中查看预览效果了。
二、java生成数据集数据
1)继承 ScriptedDataSetEventAdapter适配器类,生成新的Handler,覆盖其中的fetch、open、close方法:
使用java生成数据集数据前,
1.新建个脚本数据源;
2. 新建School类;
3. 再新建ContactListFactory类;
1)按上Pojo数据源配置:
如果是有url传参
这样就可以直接得到request参数了
2) 在Property Editor视图的EventHandlerClass中指定上面生成的类DataSetHandler:
完成这步以后可以在preview中查看预览效果了。
尽管如此,为使用户更易使用,BIRT正在开发POJO数据源,使得用户不用编写任何脚本,就可以轻松做数据来自于POJO的报表。
3.12 数据源的属性绑定
在新建数据源或者编辑数据源的时候,有一页选项-属性绑定
这意味着你可以在报表运行的过程中指定JDBC URL,用户名,地址和JNDI URL,profile或者其他的配置信息,只要你在报表中新建报表参数,然后用右侧的表达式生成器去绑定
另外一种情况是,如果你的报表是用来显示日志信息的,也就是把其他工程或者项目的日志信息以一种丰富的形象化的方式显示出来,这个时候你的数据源是一个动态的地址的动态生成的文本文件。
比如一个工程的日志文件的地址为:
C:/Logs/2012-08-01
C:/Logs/2012-08-02
C:/Logs/2012-08-03
C:/Logs/2012-08-04
那么我们在构建文本文件或者平面文件数据源的时候,就可以通过属性绑定来动态指定Home folders
内容如下:
function DF(n) {
return (n > 9 ? n : '0' + n);
}
var d = new Date();
shortDate = (d.getFullYear() + '-' + DF(d.getMonth() + 1) + '-'
+ DF(d.getDate()));
HomeFolder = "C:/Logs/"+shortDate;