怎么利用java从数据库做柱状图
的有关信息介绍如下:数据报表经常会使用到各种图像来形象的展示数据,很直观的可以看出数据分布,各分类的对比。下面介绍如何使用java读取数据库数据,然后显示成柱状图
生成的图像界面主要是依赖jfreechart来实现,首先得添加jfreechart的依赖包
还需要读取数据库,这里演示的例子采用mysql数据库,所以得添加mysql的连接驱动包
新建数据库表,用来存放数据
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='学校信息表';
添加一些用来测试的数据,可以根据需要自己插入到数据库中
编写查询数据库数据方法,这里只是演示,所以采用最简单的jdbc连接查询数据,如果是正常的项目,可以使用mybatis或者hibernate来做持久化框架查询数据
创建数据集,使用查询数据库的数据,循环组装成JFreeChart需要的数据集
创建JFreeChart对象,设置图表标题、目录轴的显示标签、数值轴的显示标签、数据集、图表方向等,并设置字体和大小
运行之后看效果,效果如下图所示
最后附上完整的测试代码
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
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
Connection conn = null;
String sql;
String url = "jdbc:mysql://localhost:3306/study?"
+ "user=root&password=shaowei&useUnicode=true&characterEncoding=UTF8";
java.util.List
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;
}
}