Tuesday, January 15, 2008

Set JFreeChart data from database

A couple of days ago I needed to generate some charts using Java so I searched for a library which could do it. Soon I found JFreeChart library and downloaded it from here. But I was surprised when I saw the user guide wasn't free! Therefore I decided to write this post and describe how to obtain JFreeChart data from database (I'll use mysql database).

At first I copied jcommon-1.0.12.jar, jfreechart-1.0.9.jar and mysql-connector-java-5.0.7-bin.jar files to /WEB-INF/lib directory then I created a table in the database and filled it with below data:

type count
----------------------
invoice_detail 3273
----------------------
object_status 2819
----------------------
service_sales_... 1540
----------------------
call_function 1183
----------------------
contact 904
----------------------
invoice 775
----------------------
payment 596

Now I create DatabaseChart servlet for connecting to database and generating my chart

import org.jfree.data.jdbc.JDBCPieDataset;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.Connection;

public class DatabaseChart extends HttpServlet {

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {}

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver").
newInstance();
try {
connection = DriverManager.
getConnection("jdbc:mysql://localhost/
my_db?user=my_un&password=my_pass&
useUnicode=true&
characterEncoding=utf-8");
} catch (SQLException e) {
e.printStackTrace();
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

JDBCPieDataset dataset =
new JDBCPieDataset(connection);
try {
dataset.executeQuery("Select `type`, `count`
From my_table order by count desc");
JFreeChart chart = ChartFactory.
createPieChart("Pie Chart", dataset,
true, true, false);
if (chart != null) {
response.setContentType("image/png");
OutputStream out = response.
getOutputStream();
ChartUtilities.writeChartAsPNG(out,
chart, 450, 400);
}
} catch (SQLException e) {
e.printStackTrace();
}
try {if(connection != null){connection.close();
}}
catch (SQLException e) {e.printStackTrace();}
}

}
at the end I add the servlet information to web.xml file
 <servlet>
<servlet-name>generate_chart</servlet-name>
<servlet-class>DatabaseChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>generate_chart</servlet-name>
<url-pattern>/generate_chart</url-pattern>
</servlet-mapping>

now if you run the project you will get a chart like this

Labels: , ,

7 Comments:

At April 25, 2008 10:53 AM , Anonymous Anonymous said...

Hi Hamid,
I'm new to JFreeChart and bashing my head against a wall trying to get ANY simple graph to work when accessing a database through MS SQL Server.
I can get graphs to work without accessing a database with hardcoded values.
The error i'm getting is "Exception in thread 'main' java.lang.NoSuchMethodError: main"

Any help would be greatly appreciated.

Regards,
Gavin



Here's my code example below:

import java.*;
import org.jfree.*;
import org.jfree.data.jdbc.JDBCPieDataset;
import java.sql.Connection;
import java.sql.SQLException;
import org.jfree.data.general.PieDataset;
import org.jfree.chart.*;

public class GraphCon {

private PieDataset readData()
{
JDBCPieDataset data = null;
String url = "jdbc:jtds:sqlserver://192.168.0.2:1433/pubs";

Connection con;
try
{
Class.forName("net.sourceforge.jtds.jdbc.Driver");
}
catch (ClassNotFoundException e)
{
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try
{
con = java.sql.DriverManager.getConnection(url, "jfreechart", "password");
data = new JDBCPieDataset(con);
String sql = "SELECT npx_date,npx_value FROM npx_table ORDER BY npx_date";
data.executeQuery(sql);
con.close();
}
catch (SQLException e)
{
System.err.print("SQLException: ");
System.err.println(e.getMessage());
}
catch (Exception e)
{
System.err.print("Exception: ");
System.err.println(e.getMessage());
}
return data;
}

}

 
At April 26, 2008 10:24 AM , Blogger Hamid Reza said...

Gavin,
you can see some more things here:
http://forum.java.sun.com/thread.jspa?threadID=516207&messageID=2460058

please google it.

 
At February 12, 2009 10:47 PM , Anonymous Anonymous said...

Nice Blog.
Please Discuss more about JFreeChart and how to create it Dynamically.

 
At July 26, 2009 5:55 PM , Anonymous Anonymous said...

THANKS U HELEPED A LOT!!!

 
At January 19, 2010 2:13 PM , Anonymous Anonymous said...

Tell me how to run this project without main class and where put this web.xml file when I using NetBeans IDE 6.7

 
At January 20, 2010 7:58 AM , Blogger sri-siriworld said...

Hi Hamid, I am trying jfreecharts now. I am able to get the data from database using jfreechart, bar and pie charts aswell. But I would like to show in a drilldown view, I had seen an example http://homepage.ntlworld.com/richard_c_atkinson/jfreechart/. Where they had given using static data, if you have any example to get on dynamic (database), please post.

Any help would be greatly appreciated.

Thanks & Regards
Srikanth

 
At January 20, 2010 7:59 AM , Anonymous Anonymous said...

Hi Hamid, I am trying jfreecharts now. I am able to get the data from database using jfreechart, bar and pie charts aswell. But I would like to show in a drilldown view, I had seen an example http://homepage.ntlworld.com/richard_c_atkinson/jfreechart/. Where they had given using static data, if you have any example to get on dynamic (database), please post.

Any help would be greatly appreciated.

Thanks & Regards
Srikanth

 

Post a Comment

<< Home