教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

一个简单的Mondrian例子(部分参考某个大牛的文档~~)希望大家学到东西~教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

可以详细参考豆丁网上的一个文档:http://www.docin.com/p-88928995.html 也可以跟我一起做~

3.1 创建新的web项目

3.1.1 打开myEclipse,新建一个网站我的是这样的:

注意名字要按照我给的,取名为Tezz

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

建好之后是这样的:


教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询
3.1.2 打开你刚刚解压的文件,进入解压后的文件夹目录mondrian-3.2.1.13885/lib, 把一个名字为mondrian.war的文件解压到当前的文件夹。

 

我进入后是这样:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

我直接把.war改为.zip然后解压

3.2 添加文件

第一步

进入解压后的文件夹,选中jpivot、wcf二个文件夹及busy.jsp、error.jsp、testpage.jsp三个文件,我们需要将这些资源复制到我们测试项目的WebRoot文件夹中。

我的是这样的:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

把jpivot和wcf这两个文件夹添加到WebRoot下,把剩下三个文件添加到Web-INF里面,我添加完成之后是这样的:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

第二步

进入mondrian(之前为.war,后来改名为.zip解压后的文件夹) WEB-INF文件夹(在上面步骤中解压的项目文件mondrian.war里),选中jpivot、lib、wcf这三个文件夹,同样需要复制它们到测试项目的WEB-INF文件夹中。

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

Jpivot和wcf两个文件夹包含了用于生成用户界面的配置文件

复制进去的时候会问你:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

果断yes!

扫面之后就不会出现错误了,之前出现错误是因为我们没有添加实例进去。

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

3.3 配置web.xml

第一步:在MyEclipese 上打开我们新建项目的文件:web.xml

 

第二步:添加配置文件,直接把我给出的下列代码复制到你的web.xml文件中,注意是覆盖!在下面的代码也会相应对.xml中的一些东西做一些介绍~教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

1过滤器(filter)

复制下边所示的xml代码到我们测试项目Tezz的web.xml文件中。当然你也可以直接把解压包里面WEB-INF中的web.xml直接拖到你的项目中,可以对比以下两者的不同,其实就是<description>标签显示的内容不一样,可以自己看看。

<filter>

    <filter-name>JPivotController</filter-name>

    <filter-class>com.tonbeller.wcf.controller.RequestFilter</filter-class>

    <init-param>

      <param-name>indexJSP</param-name>

      <param-value>/index.html</param-value>

      <description>如果这是一个新的会话,则转到此页面</description>

    </init-param>

    <init-param>

      <param-name>errorJSP</param-name>

      <param-value>/error.jsp</param-value>

      <description>出错时显示的页面</description>

    </init-param>

    <init-param>

      <param-name>busyJSP</param-name>

      <param-value>/busy.jsp</param-value>

      <description>这个页面用于当用户点击一个查询时,在这个查询还未将结果还回给用户时所显示的界面</description>

    </init-param>

</filter>

 

  <filter-mapping>

    <filter-name>JPivotController</filter-name>

    <url-pattern>/testpage.jsp</url-pattern>

  </filter-mapping>

2 初始化资源的linstener

复制下面的listener到我们的web.xml文件中(用于初始化一些资源)

<listener>

    <listener-class>mondrian.web.taglib.Listener</listener-class>

  </listener>

 

  <!– 资源初始化-->

  <listener>

    <listener-class>com.tonbeller.tbutils.res.ResourcesFactoryContextListener</listener-class>

  </listener>

 

3 Print  servlet

该servlet用于将数据生成Excel文件或pdf文件并返回给用户,如果您需要用到该功能,则需要将其copy到您项目的web.xml文件中

<servlet>

    <servlet-name>Print</servlet-name>

    <display-name>Print</display-name>

    <description>Default configuration created for servlet.</description>

    <servlet-class>com.tonbeller.jpivot.print.PrintServlet</servlet-class>

  </servlet>

 <servlet-mapping>

    <servlet-name>Print</servlet-name>

    <url-pattern>/Print</url-pattern>

  </servlet-mapping>

4 MDXQueryServlet

MDXQueryServlet用于接受并执行一个MDX查询,然后将该查询以Html表格的形式返回。其中的参数connectString用于指定连接到数据库的字符串,例如使用jtds驱动连接到sql server 2000的字符串如下:

Provider=mondrian;Jdbc=jdbc:jtds:sqlserver://localhost/Tezz;user=sa;password=123456;Catalog=/WEB-INF/queries/tezz.xml;JdbcDrivers=net.sourceforge.jtds.jdbc.Driver;

如果您需要用到该功能,则需要将其copy到您项目的web.xml文件中。

<servlet>

    <servlet-name>MDXQueryServlet</servlet-name>

    <servlet-class>mondrian.web.servlet.MDXQueryServlet</servlet-class>

    <init-param>

      <param-name>connectString</param-name>

      <param-value>@[email protected]</param-value>

    </init-param>

  </servlet>

 <servlet-mapping>

    <servlet-name>MDXQueryServlet</servlet-name>

    <url-pattern>/mdxquery</url-pattern>

  </servlet-mapping>

5 DisplayChart 和GetChart 这两个Servlet

DisplayChart 和GetChart 这两个Servlet 用于生成图表和将其显示给最终用户,如果您需要用到该功能,则需要将其copy到您项目的web.xml文件中。

<!-- jfreechart provided servlet -->

  <servlet>

    <servlet-name>DisplayChart</servlet-name>

    <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>

  </servlet>

  <!-- jfreechart provided servlet -->

  <servlet>

    <servlet-name>GetChart</servlet-name>

    <display-name>GetChart</display-name>

    <description>Default configuration created for servlet.</description>

    <servlet-class>com.tonbeller.jpivot.chart.GetChart</servlet-class>

  </servlet>

<servlet-mapping>

    <servlet-name>DisplayChart</servlet-name>

    <url-pattern>/DisplayChart</url-pattern>

  </servlet-mapping>

<servlet-mapping>

    <servlet-name>GetChart</servlet-name>

    <url-pattern>/GetChart</url-pattern>

  </servlet-mapping>

 

•       它们用于向用户生成和显示如下所示的各种图表:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

6 添加标签库

•       最后添加以下标签库到我们的web.xml项目中即可

<taglib>

    <taglib-uri>http://www.tonbeller.com/wcf</taglib-uri>

    <taglib-location>/WEB-INF/wcf/wcf-tags.tld</taglib-location>

  </taglib>

 

  <taglib>

    <taglib-uri>http://www.tonbeller.com/jpivot</taglib-uri>

    <taglib-location>/WEB-INF/jpivot/jpivot-tags.tld</taglib-location>

  </taglib>

 

到这里,我们对mondrian在web.xml的配置有一定的了解,并可按需要添加相应的功能。接下来我们将要创建本例子所要用到的表格及数据。

 

3.4 准备测试用表

 

本例使用的表结构如下所示:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

Sale是事实表,它有两个维:客户(customer)维和由两个表组成的产品(Product)维。

表格的创建很简单,您只需要将下面的sql语句导入数据库即可

1 使用以下sql语句创建表


create table Sale (
         saleId int not null,
         proId int null,
         cusId int null,
         unitPrice float null,  --单价
         number int null,        --数量
         constraint PK_SALE primary key (saleId)
)

        
create table Customer (
         cusId int not null,
         gender char(1) null,         --性别
         constraint PK_CUSTOMER primary key (cusId)
)

create table Product (
         proId int not null,
         proTypeId int null,
         proName varchar(32) null,
         constraint PK_PRODUCT primary key (proId)
)

create table ProductType (
         proTypeId int not null,
         proTypeName varchar(32) null,
         constraint PK_PRODUCTTYPE primary key (proTypeId)
)

2 使用以下sql语句导入数据

insert into Customer(cusId,gender) values(1,'F')
insert into Customer(cusId,gender) values(2,'M')
insert into Customer(cusId,gender) values(3,'M')
insert into Customer(cusId,gender) values(4,'F')

insert into producttype(proTypeId,proTypeName) values(1,'电器')
insert into producttype(proTypeId,proTypeName) values(2,'数码')
insert into producttype(proTypeId,proTypeName) values(3,'家具')

insert into product(proId,proTypeId,proName) values(1,1,'洗衣机')
insert into product(proId,proTypeId,proName) values(2,1,'电视机')
insert into product(proId,proTypeId,proName) values(3,2,'mp3')
insert into product(proId,proTypeId,proName) values(4,2,'mp4')
insert into product(proId,proTypeId,proName) values(5,2,'数码相机')
insert into product(proId,proTypeId,proName) values(6,3,'椅子')
insert into product(proId,proTypeId,proName) values(7,3,'桌子')

insert into sale(saleId,proId,cusId,unitPrice,number) values(1,1,1,340.34,2)
insert into sale(saleId,proId,cusId,unitPrice,number) values(2,1,2,140.34,1)
insert into sale(saleId,proId,cusId,unitPrice,number) values(3,2,3,240.34,3)
insert into sale(saleId,proId,cusId,unitPrice,number) values(4,3,4,540.34,4)
insert into sale(saleId,proId,cusId,unitPrice,number) values(5,4,1,80.34,5)
insert into sale(saleId,proId,cusId,unitPrice,number) values(6,5,2,90.34,26)
insert into sale(saleId,proId,cusId,unitPrice,number) values(7,6,3,140.34,7)
insert into sale(saleId,proId,cusId,unitPrice,number) values(8,7,4,640.34,28)
insert into sale(saleId,proId,cusId,unitPrice,number) values(9,6,1,140.34,29)
insert into sale(saleId,proId,cusId,unitPrice,number) values(10,7,2,740.34,29)
insert into sale(saleId,proId,cusId,unitPrice,number) values(11,5,3,30.34,28)
insert into sale(saleId,proId,cusId,unitPrice,number) values(12,4,4,1240.34,72)
insert into sale(saleId,proId,cusId,unitPrice,number) values(13,3,1,314.34,27)
insert into sale(saleId,proId,cusId,unitPrice,number) values(14,3,2,45.34,27)

 

 

3.5 建立模式文件

 

•       一个模式定义了一个多维数据库. 它包含一个逻辑模型(logical model)、一组数据立方(consisting of cubes)、层次(hierarchies)、和成员(members), 并映射到物理模型(关系数据库)上。

•       简单的说,配置一个模式就是配置一个关系数据结构到多维数据结构的映射。

注:

    关于mondrian的模式及模式的配置,这里我们只对其进行了简单介绍。

 

3.5.1创建模式文件

    模式文件的创建很简单。首先在WEB-INF下新建一个queries的文件夹,然后在该文件夹下创建一个名为tezz.xml的文件。再按下面的步骤将xml元素添加入即可。

 

 

 教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

3.5.2 配置模式文件

添加数据立方Sales:教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

<Schema name = “tezz”>

<Cube name = “mondrianText”>

       <!--事实表sale(fact table)-->

       <Table name = “sale”/>

</Cube>

</Schema>

 

添加数据立方Sales 的维:


教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

添加产品维( 因为产品维由两个表连接而成,因此比客户维复杂些)

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

 

添加度量( 共有三个度量: 数量、平均单价和总销售额)

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

最后生成的tezz.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<Schema name="tezz">

<Cube name="Sales">

    <!-- 事实表(fact table) -->

    <Table name="sale" />

    <!-- 客户维 -->

    <Dimension name="客户性别" foreignKey="cusId">

       <Hierarchy hasAll="true" allMemberName="所有性别" primaryKey="cusId">

           <Table name="Customer"></Table>

           <Level name="gender" column="gender"></Level>

       </Hierarchy>

    </Dimension>

 

    <!-- 产品类别维 -->

    <Dimension name="产品类别" foreignKey="proId">

       <Hierarchy hasAll="true" allMemberName="所有产品" primaryKey="proId"

           primaryKeyTable="product">

           <join leftKey="proTypeId" rightKey="proTypeId">

              <Table name="product" />

              <Table name="producttype"></Table>

           </join>

           <Level name="proTypeId" column="proTypeId" nameColumn="proTypeName"

              uniqueMembers="true" table="producttype" />

           <Level name="proId" column="proId" nameColumn="proName"

              uniqueMembers="true" table="product" />

       </Hierarchy>

    </Dimension>

    <Measure name="数量" column="number" aggregator="sum" datatype="Numeric" />

    <Measure name="总销售额" aggregator="sum" formatString="¥#,##0.00">

    <!-- unitPrice*number所得值的列 -->

       <MeasureExpression>

           <SQL dialect="generic">

              (unitPrice*number)

           </SQL>

       </MeasureExpression>

    </Measure>

    <CalculatedMember name="平均单价" dimension="Measures">

       <Formula>

           [Measures].[总销售额] / [Measures].[数量]

       </Formula>

       <CalculatedMemberProperty name="FORMAT_STRING" value="¥#,##0.00" />

    </CalculatedMember>

</Cube>

</Schema>

3.6编写MDX查询语句

•       在模式文件定义完成之后,我们就可以根据它来编写相应MDX查询语句了。

•       本例所用的MDX语句如下:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

我们可以很清楚的看出,columns轴维度包含的是度量。Rows轴维度包含的是维度中的层次的所有成员(allMemberName)

3.7 创建查询文件

注意,连接数据库之前需要配置数据库连接的插件,jdbc, 去微软官网或是找同学要一个jdbc的包,添加到JAVA安装路径的这个文件夹

 

 教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

如果这个方法不行的话,可以用eclipse 或是myEclipse 手动导入:、

们在用Eclipse开发程序的时候,经常想要用到第三方的jar包。这时候我们就需要在相应的工程下面导入这个jar包。以下配图说明导入jar包的步骤。

1.右击工程的根目录,点击Properties进入Properties。或者选中工程根目录,按Alt-Enter即可。

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询
教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

 

2.在Properties页面中选中Java Build Path,选中Libraries标签,点击Add External JARs。

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

3.找到需要添加的jar包,确定即可。

 

 教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

•       现在我们将创建一个jsp文件,该jsp使用jpivot的mondrianQuery标签来完成查询。

•       该文件最后将被testpage.jsp使用。

•       在/WEB-INF/queries文件夹下面创建一名为tezz的jsp文件。该jsp包含如下内容:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

JSP如下:

<%@ page session="true" contentType="text/html; charset=ISO-8859-1" %>

<%@ taglib uri="http://www.tonbeller.com/jpivot" prefix="jp" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

 

<jp:mondrianQuery id="query01"

    jdbcDriver="com.mysql.jdbc.Driver"

    jdbcUrl="jdbc:mysql://localhost/test"

    catalogUri="/WEB-INF/queries/tezz.xml"

    jdbcUser="root" jdbcPassword="123" connectionPooling="false">

    select {[Measures].[数量],[Measures].[平均单价],[Measures].[总销售额]} ON columns,

       {([产品类别].[所有产品],[客户性别].[所有性别])} ON rows

    from [Sales]

</jp:mondrianQuery>

 

<c:set var="title01" scope="session">Sales</c:set>

需要注意的问题是,你要自己修改连接数据库的那几行代码

2.9 布署项目

 

至此我们已经全部配置完成,文件结构如下:

 

蓝色部分为我们添加或创建的部分

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

•       布署项目,启动Tomcat,在浏览器上输入http://localhost:8080/Tezz/testpage.jsp?query=tezz 即可看到如下结果:

教会你如何在自己建立的网站上使用Mondrian和MDX语句对数据库查询

 

注:

  testpage.jsp?query=tezz,这里的tezz即刚我们创建的用于查询jsp文件名称