ファイヤープロジェクト
DBからチャート生成のためのデータを読み込む(JFreechart 0.9.21)
2004-11-27T22:30+09:00   matsu
JFreeChartには,チャート作成のためのデータをDBからデータを読み込むクラスがある.これを使用すると,比較的楽にDBのデータをグラフ化するJavaプログラムを作成することができる.
JFreeChart-0.9.21では,内部でJDBCを使用してデータを読み込むDatasetがある.
  • org.jfree.data.jdbc.JDBCXYDataset;
  • org.jfree.data.jdbc.JDBCPieDataset;
  • org.jfree.data.jdbc.JDBCCategoryDataset;
これらのクラスの使用方法は簡単である.以下にサンプルを示す.
このサンプルはPostgreSQLのJDBCドライバを使用する.他のDBを使用する場合は,定数JDBC_DIRVERを書き換えて試されたい.コンパイルして実行してみる(※).
$ javac -classpath ./:./jfreechart-0.9.21.jar:jcommon-0.9.6.jar SampleReadByJDBC.java
$ java -cp ./:./jfreechart-0.9.21.jar:./jcommon-0.9.6.jar:./postgresql-jdbc2.jar \
  SampleReadByJDBC jdbc:postgresql://dbserver/firstdb matsu hogefuga xy
当然ながらDBのURL,ユーザ,パスワードは環境に応じて書き換える.最後の引数は先述の3つのDatsetを切替えるために使用している.xyの場合は,DBからXYDatasetのデータを作成する.
※ サンプル実行のためのテーブル,データ作成のSQLを以下に示す.
もう一度,JFreeChart-0.9.21では,内部でJDBCを使用してデータを読み込むDatasetがある.
  • org.jfree.data.jdbc.JDBCXYDataset;
  • org.jfree.data.jdbc.JDBCPieDataset;
  • org.jfree.data.jdbc.JDBCCategoryDataset;
サンプルでは,各Datasetがデータを取得するためのSQLをそれぞれ定数で定義している.
CategoryDataset用データ読み込みSQL
選択されるフィールドは最低二つ.一つ目はカテゴリ名に使用され,残りは値として使用される.
private static final String CATEGORY_SQL =
  "SELECT category, avg(y1_value) AS Y1_AVG, \
   avg(y2_value) AS Y2_AVG, avg(y3_value) AS Y3_AVG \
   FROM sample_data GROUP BY category;";
ASを使用してフィールド名を変えているのは,JDBCCategoryDatasetがフィールド名を使用してシリーズを識別しているためである.上のSQLの場合,ASがなければ二つ目以降のフィールド名が皆avgになって,1シリーズしか認識されない.
PieDataset用データ読み込みSQL
選択されるフィールドは二つ.一つ目はVARCHARでカテゴリ名に使用され,残りは値として使用される.
private static final String PIE_SQL =
  "SELECT category, count(category) FROM sample_data GROUP BY category;";
XYDataset用データ読み込みSQL
選択されるフィールドは最低二つ.一つ目はX軸値として使用され,残りはY軸値として使用される.
private static final String XY_SQL =
  "SELECT x_value, y1_value, y2_value, y3_value FROM sample_data;";
JDBCXYDatasetでは,横軸を時間軸にしたTimeSriesChartを作成することができる.以下にサンプルを示す.
先のサンプルとの相違点は,SQL文とチャート作成時に以下を使用する点である.
        } else if (xyDataset != null) {
            myChart = ChartFactory.createTimeSeriesChart ("SampleReadByJDBC2 - XYDataset -",
                                                          "domain",
                                                          "range",
                                                          xyDataset,
                                                          true, true, true);
        }
JDBCXYDatasetは,SELECT結果の第一フィールドがDATE型だと,isTimeSeriesメソッドの返り値がtrueとなる.すなわち,内部でSELECTフィールドの第一フィールドがTimeSeriesかどうかを自動認識する.サンプルを実行した結果を以下に示す.
$ javac -classpath ./:./jfreechart-0.9.21.jar:jcommon-0.9.6.jar SampleReadByJDBC2.java
$ java -cp ./:./jfreechart-0.9.21.jar:./jcommon-0.9.6.jar:./postgresql-jdbc2.jar \
  SampleReadByJDBC2 jdbc:postgresql://thor/firstdb matsu hogefuga xy
※ サンプル実行のためのテーブル,データ作成のSQLを以下に示す.
matsu(C)
Since 2002
Mail to matsu