⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stathandle.java

📁 实现java动态生成统计图表,开发环境是myeclipse6.0+tomcat+mysql
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -