多语言展示
当前在线:1066今日阅读:91今日分享:37

怎么利用java从数据库做柱状图

数据报表经常会使用到各种图像来形象的展示数据,很直观的可以看出数据分布,各分类的对比。下面介绍如何使用java读取数据库数据,然后显示成柱状图
工具/原料
1

idea

2

jfreechart

方法/步骤
1

生成的图像界面主要是依赖jfreechart来实现,首先得添加jfreechart的依赖包    org.jfree    jfreechart    1.0.19

2

还需要读取数据库,这里演示的例子采用mysql数据库,所以得添加mysql的连接驱动包    mysql    mysql-connector-java    5.1.30

3

新建数据库表,用来存放数据CREATE TABLE `t_school_info` (  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',  `school` varchar(255) DEFAULT NULL COMMENT '学校',  `area` varchar(255) DEFAULT NULL COMMENT '地区',  `amount` int(11) DEFAULT '0' COMMENT '数量',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学校信息表';

4

添加一些用来测试的数据,可以根据需要自己插入到数据库中

5

编写查询数据库数据方法,这里只是演示,所以采用最简单的jdbc连接查询数据,如果是正常的项目,可以使用mybatis或者hibernate来做持久化框架查询数据

6

创建数据集,使用查询数据库的数据,循环组装成JFreeChart需要的数据集

7

创建JFreeChart对象,设置图表标题、目录轴的显示标签、数值轴的显示标签、数据集、图表方向等,并设置字体和大小

8

运行之后看效果,效果如下图所示

9

最后附上完整的测试代码package cn.sw.study.common.test.chart;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import javax.swing.*;import java.awt.*;import java.sql.*;import java.util.ArrayList;/** * 测试柱状图 * Created by shaowei on 2017/8/16. */public class TestBarChart {    ChartPanel frame;    public TestBarChart(){        CategoryDataset dataset = getDataSet();        JFreeChart chart = ChartFactory.createBarChart3D(                '学校', // 图表标题                '学校类型', // 目录轴的显示标签                '数量', // 数值轴的显示标签                dataset, // 数据集                PlotOrientation.VERTICAL, // 图表方向:水平、垂直                true,      // 是否显示图例(对于简单的柱状图必须是false)                false,     // 是否生成工具                false      // 是否生成URL链接        );        //从这里开始        CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象        CategoryAxis domainAxis=plot.getDomainAxis();     //水平底部列表        domainAxis.setTickLabelFont(new Font('宋体',Font.BOLD,12)); //垂直标题        domainAxis.setLabelFont(new Font('黑体', Font.BOLD,14));     //水平底部标题        ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状        rangeAxis.setLabelFont(new Font('黑体',Font.BOLD,15));        chart.getLegend().setItemFont(new Font('黑体', Font.BOLD, 15));        chart.getTitle().setFont(new Font('宋体',Font.BOLD,20));//设置标题字体        //到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题        frame=new ChartPanel(chart,true);    //这里也可以用chartFrame,可以直接生成一个独立的Frame    }    private static CategoryDataset getDataSet() {        DefaultCategoryDataset dataset = new DefaultCategoryDataset();        java.util.List list = queryData();        for (SchoolInfo schoolInfo : list) {            dataset.addValue(schoolInfo.getAmount(), schoolInfo.getArea(), schoolInfo.getSchool());        }        return dataset;    }    public ChartPanel getChartPanel(){        return frame;    }    public static void main(String[] args) {        JFrame frame = new JFrame('Java柱状图图');        // frame.setLayout(new GridLayout(2,2,10,10));        frame.add(new TestBarChart().getChartPanel()); // 添加柱形图        frame.setBounds(50, 50, 800, 600);        frame.setVisible(true);    }    public static java.util.List queryData(){        Connection conn = null;        String sql;        String url = 'jdbc:mysql://localhost:3306/study?'                + 'user=root&password=shaowei&useUnicode=true&characterEncoding=UTF8';        java.util.List list = new ArrayList();        try {            Class.forName('com.mysql.jdbc.Driver');            conn = DriverManager.getConnection(url);            Statement stmt = conn.createStatement();            sql = 'select id,school,area,amount from t_school_info';            ResultSet rs = stmt.executeQuery(sql);            while (rs.next()) {                list.add(new SchoolInfo(rs.getInt(1), rs.getInt(4), rs.getString(3), rs.getString(2)));            }        } catch (SQLException e) {            System.out.println('MySQL操作错误');            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        return list;    }}

注意事项

本例中使用的简单的jdbd连接,如果是正常的项目使用,则需要使用数据库连接池,使用mybatis这样的持久化框架,否则效率和性能会有问题

推荐信息