« 上一篇: Tapestry+Hibernate+Jfreechart,做一个简单的报表 (四) 下一篇: [说点废话]王垠退学 »
Lenciel @ 2005-09-23 16:06

四、 持久层
     由于是先有数据库,然后建立POJO类和映射关系*.hbm.xml,可以使用Middlegen。现在Middlegen有了支持Eclipse的插件MiddlegenIDE,其安装非常简单,使用也十分方便。具体的安装步骤和使用说明可以看这里,如果对e文过敏的话夏昕的那个文档也很不错。安装好之后,在新建中会多一种MiddleGen Build File选择


     选择你使用的数据库的JDBC类,数据库地址,用户名和密码,就可以方便的根据现有的数据库建立一个Java的POJO类和相应的hbm以及cfg文件了。


     要测试这个文件是否正确,可以编写一个test类,来查询数据库里面某个时间的噪声值。
/*
* 编写日期 2005-9-5
*/
package org.lenciel.hibernate.test;
import org.lenciel.util.DateUtil;
import java.util.List;
import org.lenciel.hibernate.model.NoiseData;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.expression.Expression;

/**
 * @author Lee
 */
public class Test {

  public static void main(String[] args) {

     try {
SessionFactory sf = new Configuration().configure()
.buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
String str= "2005-9-5 13:14:00";
       List dataset =    session.createCriteria(NoiseData.class)
        .add( Expression.eq("stime",DateUtil
        .stringToDate("yyyy-MM-dd HH:mm:ss",str)))
        .list();
System.out.println(((NoiseData)dataset.get(0))
         .getDvalue());

} catch (HibernateException e) {
e.printStackTrace();
     }
  }
}

     注意我们的数据库是每秒一个数据采过来,所以需要把Date类实现为“yyyy-MM-dd HH:mm:ss”格式的实例。运行这个test类得到的结果和在数据库中select查询的结果是完全一致的。


五、 JFreechart做什么?

     JFreechart需要做的就是把hibernate读出的数据装进自己的时间图(TimeseriesChart)的Dataset中,然后绘制曲线后把这个曲线保存到Tapestry的Image组件所定义的地址中,供SecondPage页面显示。这些内容是由一个ChartGen类完成的:
/*
* 编写日期 2005-9-11
*/
package org.lenciel.tapestry;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.expression.Expression;

import org.apache.tapestry.IPage;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.lenciel.hibernate.NoiseData;
import org.lenciel.util.DateUtil;

/**
 * @author Lenciel
 *
 */
public class ChartGen {
   private int i;
   public TimeSeries getSeries(
                Date date1, Date date2) {

       TimeSeries ts = new TimeSeries("噪声检测器一", Second.class);

       try {
           SessionFactory sf = new Configuration().
                 configure().buildSessionFactory();
           Session session = sf.openSession();
           Transaction tx = session.beginTransaction();

           List dataset = session.createCriteria(NoiseData.class).add(
                   Expression.between("stime", date1, date2)).list();
           i= 0;
           while( i<(dataset.size())) {
           float valueInc = ((NoiseData) dataset.get(i)).getDvalue();
           Date  date = ((NoiseData) dataset.get(i)).getStime();
           ts.add(new Second(date), valueInc);
           i++;
           }
           tx.commit();
           session.close();
       } catch (HibernateException e) {
           e.printStackTrace();
       }
       return ts;
   }

   public TimeSeries getSeries(Date date1) {

       TimeSeries ts = new TimeSeries("噪声检测器一", Second.class);

       try {
           SessionFactory sf = new Configuration().configure()
                   .buildSessionFactory();
           Session session = sf.openSession();
           Transaction tx = session.beginTransaction();
          
           List dataset = session.createCriteria(NoiseData.class).add(
            Expression.between("stime", date1, DateUtil.today())).list();
           i= 0;
           while( i<(dataset.size())) {
           float valueInc = ((NoiseData) dataset.get(i)).getDvalue();
           Date  date = ((NoiseData) dataset.get(i)).getStime();
           ts.add(new Second(date), valueInc);
           i++;
           }
          
          
           tx.commit();
           session.close();
       } catch (HibernateException e) {
           e.printStackTrace();
       }
       return ts;
   }
  

   public void genChart(IPage page) {
       String chartFileName = "";//初始化图片名
       TimeSeriesCollection tsc = new TimeSeriesCollection();
       SecondPage spage = (SecondPage) page;

       Date date = spage.getDate1();
       Date date2 = DateUtil.today();
       //这里我的终止日期取的是当前机器时间,也就是没用用户的输入
     
       tsc.addSeries(getSeries(date, date2));

       JFreeChart chart =
       ChartFactory.createTimeSeriesChart(
         "噪声   截止日期:"+ DateUtil.
         dateToStr("yyyy-MM-dd HH:mm:ss", date2),
         "时间轴","值轴", tsc, true, true, false);
       //图片的具体设置
      
       XYPlot plot = chart.getXYPlot();
       DateAxis axis = (DateAxis) plot.getDomainAxis();
       axis.setAutoRange(true);//自动定时间轴长度
       axis.setFixedAutoRange(60000D);
       axis=(DateAxis)plot.getRangeAxis();
       axis.setRange(0.0D,200D);
       setDateAxis(axis);
       /*
        * axis.setTickUnit( new DateTickUnit( DateTickUnit.MONTH, 1, new
        * SimpleDateFormat("yyyy-MM")));
        */
  axis.setTickUnit(new DateTickUnit(DateTickUnit.SECOND, 1,
               new SimpleDateFormat("HH:mm:ss")));
       axis.setRange(date, date2);
   axis.setVerticalTickLabels(false);//规定时间轴文字对齐方式

       //把图片放入临时目录
       ChartRenderingInfo info = new ChartRenderingInfo(
               new StandardEntityCollection());
       try {
           chartFileName = ServletUtilities.
             saveChartAsPNG(chart, 800, 600,
          info, ((SecondPage) page).getRequestCycle()
           .getRequestContext().getSession());
  ((SecondPage) page).setCharturl(chartFileName);
       } catch (IOException e) {
           e.printStackTrace();
           chartFileName = "";
       }
      

   }

   private Date incFixthMinute(Date date) {
       Calendar cal = Calendar.getInstance();
       cal.setTime(date);
       cal.add(Calendar.MINUTE, 15);
       return cal.getTime();
   }

   private void setDateAxis(DateAxis axis) {
       axis.setTickUnit(
           new DateTickUnit(DateTickUnit.HOUR, 1,
           new SimpleDateFormat("yyyy-MM-dd hh:mm")));
   }

}


      这样,我们在Jetty或者Tomcat下运行这个程序,然后访问这个服务,输入起始终止日期,就可以得到噪声曲线了。点击看原图



     这里主要是以例子为主,假设看官都是有一定基础的,具体的why和how就没有说得很清楚,因为牵涉的东西实在很多,网上也有人说得比较清楚了。欢迎有问题联系我,也提供整个项目的源码,需要的可以留下邮箱。

      下面还可以做的工作是:
      1、 实时的显示数据库的变动。
      2、 做一个更加完善的DateInput页面。比如用户可以从DatePick框选择时间;或者可以选择“画过去5分钟”,“画大于56的噪声比例图”等等。这些都可以写简单的hibernate查询语句实现,并不困难。

      现在整个工程都放在了论坛上面,包括Jfreechart的UserGuide指导书。



最新评论 (点击这里查看更早的所有评论...)


Leo

2006-06-18 22:17

想请教你一个问题就是,时间轴不好确定,当数据很多时,怎样在X轴上只显示均匀的几个刻度,比如一天12小时的数据,也许在1点钟有5条数据,2点有20条,那么我要在X轴上显示1到12点这12个刻度怎么写?
谢谢!  

世界杯期间,看到这样的留言好感慨啊。 不过,你的问题我有些没有看懂。X轴如果是时间轴的话,那么以1个小时为单位分成12个区间就是均匀的。在同一时间,比如一点钟,怎么可能一个数据有五个值?数据值这个东西应该是跟时间一一对应的。


hifi

2006-07-05 10:48

我只用tapestry+hibernate,也适用middlegen生成的hibernate相关的配置文件。但是在tomcat中运行的时候,总是报NoClassFoundError,想看一下你的代码。发一份给我可以吗?谢谢。

寄出了,不过,要解决你的问题,似乎应该是你把代码发一下吧...至少把报错发完整一点嘛。


jFree

2006-11-03 18:45

我们公司现在也在做web上的曲线显示,我想问一下,就是时间轴的设置,想设成垂直的样子例如:11-03
      19:30(月,日,时,分)



Lenciel

2006-11-04 16:47

你说的这个事情倒是容易,setAxis方法好像有这个属性的。你搜索一下Jfreechart的用户指南吧。



jFree

2006-11-05 20:36

Lenciel ,在问你一下,我x轴上有7000个(y上也有7000)数据要显示,用TimeSeries的add添加时,是成对添加,现在我的x轴只要标20个标记,怎么做啊?

你的意思是,有7000个数据,但是x轴的间隔不是取一个单位是吧?你留下email吧


lcl0736

2006-11-17 23:01

可以给我一份代码吗?最近正在看相关的东西

实在是不好意思,把本本扔家里了。可能要过点时间才能给你。


qiyan

2006-12-07 12:14 网址: http://hi.baidu.com/javastudy

[DX]
qiyan911@gmail.com
你好,能给我留一份儿吗?我最近就再搞这个,非常感谢.下面是我的blog,有空去坐坐.
http://hi.baidu.com/javastudy



qiyan

2006-12-07 12:45

你好,我还想问一下,hibernate的数据(List list)怎么放到dataset中?用到了什么方法?

代码里面很清楚了吧。
session.createCriteria(NoiseData.class).add(Expression.between("stime", date1, DateUtil.today())).list();
这句返回的就是dataset啊,同时它也是一个List


yxt830215

2006-12-25 11:29

你好,能给我发一份儿吗?谢谢

请到论坛自己下载。


follow

2008-03-20 13:06 匿名 60.207.*.*

lovest317@163.com
我也想要,谢谢


评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定

.:回到首页
.:网志分类
『所有网 志』
档案一理
关门一看
眉头一皱
两腿一张
鼠标一点
仰天一笑
弹指一挥
.:订阅网志
.:站内搜索
.:保持联系

Locations of visitors to 

this page

给我发邮件

使用手机查看此

blog

捐献时间

,分享快乐

给我发语音留言

.:友情链接
.:声色犬马

.:Meta

Creative Commons 

License

订阅 RSS

歪酷博客

0180426

web stats