📄 stathandle.java
字号:
package stat;
import java.sql.*;
import java.util.*;
import java.io.*;
import java.text.SimpleDateFormat;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.Day;
public class StatHandle {
/**
* 往数据库插入新的访问信息
* @param ip String 用户IP地址
* @param oper String
* @param browser String
* @throws Exception
*/
public static void insert(String ip, String os, String browser) throws
Exception {
Connection cnn = null;
PreparedStatement ps = null;
try {
cnn = DBHandle.getConnection(); //获取连接句柄
ps = cnn.prepareStatement( //创建语句句柄
"insert into history(ip, os, browser, accessdate, accesstime) values(?,?,?,?,?)");
//填充参数
ps.setString(1, ip);
ps.setString(2, os.toUpperCase()); //存大写
ps.setString(3, browser.toUpperCase());
ps.setDate(4, new java.sql.Date(System.currentTimeMillis()));
ps.setTime(5, new Time(System.currentTimeMillis()));
ps.executeUpdate(); //执行语句
}
catch (Exception es) {
throw es;
}
finally {
DBHandle.closeResource(ps, null, cnn); //释放语句句柄和连接句柄
}
}
/**
* 往数据库插入新的访问信息
* @param os String 操作系统
* @param browser String 浏览器
*/
public static void insert(String os, String browser) throws
Exception {
Connection cnn = null;
PreparedStatement ps = null;
try {
cnn = DBHandle.getConnection();
//获取连接句柄
ps = cnn.prepareStatement(
"insert into history(os, browser, accessdate, accesstime) values(?,?,?,?)");
//创建语句句柄
ps.setString(1, os.toUpperCase());
//填充语句参数,将操作系统名称保存为大写
ps.setString(2, browser.toUpperCase());
//将浏览器名称保存为大写
ps.setDate(3, new java.sql.Date(System.currentTimeMillis()));
//访问日期为当天
ps.setTime(4, new Time(System.currentTimeMillis()));
//访问时间为当时
ps.executeUpdate();
//执行语句,往history表中插入一条记录
}
catch (Exception es) {
throw es;
//直接将异常抛出,由外部程序处理
}
finally {
DBHandle.closeResource(ps, null, cnn);
//释放语句句柄和连接句柄
}
}
/**
* 获取当月在内,前几月的访问数据,并保存到数据集(JFreeChart要用到)中
* @param count int 要统计多少天的数据
* @return DefaultCategoryDataset 返回数据集,里面包含前count月每月的访问次数
*/
public static DefaultCategoryDataset getMonthStat(int count) throws
Exception {
Connection cnn = null;
PreparedStatement ps = null;
ResultSet rs = null;
DefaultCategoryDataset chart = new DefaultCategoryDataset();
//数据集,用于保存前count月每月的访问次数
try {
cnn = DBHandle.getConnection(); //获取连接句柄
java.util.Date date = new java.util.Date();
//创建日期对象,默认为当前日期
for (int i = 0; i < count; i++) {
//循环count次,依次获取给定月的访问次数并保存在数据集中
String start = THandle.getStartDateofNMonth(date, count - i - 1);
//获取前面第(count - i - 1)月的第一天的字符串表示
//比如2006年3月份的第一天表示为为“2006-3-1”
String end = THandle.getEndDateofNMonth(date, count - i - 1);
//获取前面第(count - i - 1)月的最后一天的字符串表示
//比如2006年3月份的最后一天表示为为“2006-3-31”
String sql = "select count(*) from history";
sql += " where accessdate>=\"" + start +
"\" and accessdate<=\"" + end + "\"";
//获取前面第(count - i - 1)月的访问次数的SQL语句
System.out.println(sql);
//将SQL语句打印在日志信息中
ps = cnn.prepareStatement(sql);
//使用SQL字符串创建语句句柄
rs = ps.executeQuery();
//执行语句获取结果集
rs.next();
//游标指向结果集中第一条记录
chart.addValue(rs.getInt(1), "访问量",
THandle.getNMonth(date, count - i - 1));
//将前面第(count - i - 1)月的访问次数保存到数据集中
DBHandle.closeResource(ps, rs, null);
//释放在本次循环中的结果集和语句句柄
}
}
catch (Exception es) {
throw es;
//直接将异常抛出,由外部程序处理
}
finally {
DBHandle.closeResource(ps, rs, cnn);
//释放连接句柄以及其他未释放的资源
}
return chart;
//返回数据集
}
/**
* 获取当天在内,前几天的访问数据,并保存到数据集(JFreeChart要用到)中
* @param count int 要统计多少天的数据
* @return XYDataset 返回数据集,里面包含前count天每天的访问次数
*/
public static XYDataset getDayStat(int count) throws
Exception {
Connection cnn = null;
PreparedStatement ps = null;
ResultSet rs = null;
TimeSeriesCollection chart = new TimeSeriesCollection();
//时间序列对象集合,里面可以存放多个TimeSeries对象,
//TimeSeriesCollection实现了XYDataset接口
TimeSeries timeseries = new TimeSeries("日访问", Day.class);
//时间序列对象,第一个参数表示时间序列的名字,第二个参数是时间类型,这里为天
//该对象用于保存前count天每天的访问次数
try {
cnn = DBHandle.getConnection();
//获取连接句柄
java.util.Date date = new java.util.Date();
//创建日期对象,默认为当前日期
for (int i = 0; i < count; i++) {
//循环count次,依次获取给定日期的访问次数并保存在数据集中
String str = THandle.getLastDate(date, count - i - 1);
//获取前面第(count - i - 1)天的日期的字符串表示
String sql = "select count(*) from history where accessdate=\"" +
str + "\"";
//获取前面第(count - i - 1)天的访问次数的SQL语句
System.out.println(sql);
//将SQL语句打印在日志信息中
ps = cnn.prepareStatement(sql);
//使用SQL字符串创建语句句柄
rs = ps.executeQuery();
//执行语句获取结果集
rs.next();
//游标指向结果集中第一条记录
StringTokenizer st = new StringTokenizer(str, "-");
//从日期字符串str中,获取年、月、日
int year = Integer.parseInt(st.nextToken());
int month = Integer.parseInt(st.nextToken());
int day = Integer.parseInt(st.nextToken());
timeseries.add(new Day(day, month, year), rs.getInt(1));
//将前面第(count - i - 1)天的访问次数保存到时间序列对象中
DBHandle.closeResource(ps, rs, null);
//释放在本次循环中的结果集和语句句柄
}
}
catch (Exception es) {
throw es;
//直接将异常抛出,由外部程序处理
}
finally {
DBHandle.closeResource(ps, rs, cnn);
//释放连接句柄以及其他未释放的资源
}
chart.addSeries(timeseries);
//将时间序列对象保存到时间序列对象集合中
return chart;
//返回数据集
}
/**
* 将某一天各个时段的访问数据取出来并保存到数据集中
* @param data DefaultCategoryDataset 数据集
* @param date String 以字符串表示的日期
* @param count int 每一天分成多少个时段
* @throws Exception
*/
public static void setHourStat(DefaultCategoryDataset data, String date,
int count) throws
Exception {
Connection cnn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
cnn = DBHandle.getConnection(); //获取连接句柄
int length = 24 / count;
//每个时段的长度,比如count = 4,那么每个时段长度为6
for (int i = 0; i < count; i++) {
//循环count次,依次获取每个时段的访问次数
String start = i * length + ":00:00";
//第i个时段的开始时间
String end = ( (i + 1) * length - 1) + ":59:59";
//第i个时段的结束时间
String sql = "select count(*) from history";
sql += " where accesstime>=\"" + start +
"\" and accesstime<=\"" + end + "\"";
sql += " and accessdate=\"" + date + "\"";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -