由于是先有数据库,然后建立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指导书。









