?? 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 + -