jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表
jooq sql
最近,我們已經展示了Java 8和函數式編程將如何為使用jOOQ和Java 8 lambda和Streams進行SQL數據的函數數據轉換為Java開發人員帶來新的視角。 今天,我們將這一步驟更進一步,將數據轉換為JavaFX XYChart.Series以根據數據生成美觀的條形圖。
設置數據庫
我們將在PostgreSQL數據庫中再次使用世界銀行開放數據的一小部分。 我們正在使用的數據如下:
( 另請參閱本文,了解針對上述數據的另一套很棒SQL查詢 )
我們現在要做的是在兩個不同的條形圖中繪制兩組值:
- 2009-2012年間每個國家的人均GDP
- 2009年至2012年期間,每個國家的債務占其GDP的百分比
然后,這將創建8個系列,兩個圖表中的每個系列都有四個數據點。 除了上述內容之外,我們還希望按2009-2012年之間的平均預測值對系列進行排序,以便可以輕松比較系列-進而比較國家/地區。 通過結果圖表在視覺上進行解釋顯然比在文本上進行解釋容易,因此請繼續關注,直到文章結尾。
使用jOOQ和JavaFX收集數據
我們將編寫以計算上述數據系列的查詢在普通SQL中如下所示:
select COUNTRIES.YEAR, COUNTRIES.CODE, COUNTRIES.GOVT_DEBT from COUNTRIES join (select COUNTRIES.CODE, avg(COUNTRIES.GOVT_DEBT) avg from COUNTRIES group by COUNTRIES.CODE ) c1 on COUNTRIES.CODE = c1.CODE order by avg asc, COUNTRIES.CODE asc, COUNTRIES.YEAR asc換句話說,我們只需要從COUNTRIES表中選擇相關列,就可以自動加入每個國家/地區的平均預測值,以便可以按該平均值對結果進行排序。 可以使用窗口函數來編寫相同的查詢。 我們稍后再講。
我們將編寫以下代碼來使用jOOQ和JavaFX創建這樣的條形圖:
CategoryAxis xAxis = new CategoryAxis(); NumberAxis yAxis = new NumberAxis(); xAxis.setLabel("Country"); yAxis.setLabel("% of GDP");BarChart<String, Number> bc = new BarChart<>(xAxis, yAxis); bc.setTitle("Government Debt"); bc.getData().addAll(// SQL data transformation, executed in the DB// -------------------------------------------DSL.using(connection).select(COUNTRIES.YEAR,COUNTRIES.CODE,COUNTRIES.GOVT_DEBT).from(COUNTRIES).join(table(select(COUNTRIES.CODE, avg(COUNTRIES.GOVT_DEBT).as("avg")).from(COUNTRIES).groupBy(COUNTRIES.CODE)).as("c1")).on(COUNTRIES.CODE.eq(field(name("c1", COUNTRIES.CODE.getName()), String.class)))// order countries by their average // projected value.orderBy(field(name("avg")),COUNTRIES.CODE,COUNTRIES.YEAR)// The result produced by the above statement// looks like this:// +----+----+---------+// |year|code|govt_debt|// +----+----+---------+// |2009|RU | 8.70|// |2010|RU | 9.10|// |2011|RU | 9.30|// |2012|RU | 9.40|// |2009|CA | 51.30|// +----+----+---------+// Java data transformation, executed in app memory// ------------------------------------------------// Group results by year, keeping sort // order in place.fetchGroups(COUNTRIES.YEAR)// The generic type of this is inferred...// Stream<Entry<Integer, Result<// Record3<BigDecimal, String, Integer>>// >>.entrySet().stream()// Map entries into { Year -> Projected value }.map(entry -> new XYChart.Series<>(entry.getKey().toString(),observableArrayList(// Map records into a chart Dataentry.getValue().map(country -> new XYChart.Data<String, Number>(country.getValue(COUNTRIES.CODE),country.getValue(COUNTRIES.GOVT_DEBT)))))).collect(toList()) );真正有趣的是,我們可以從數據庫中獲取數據,然后將其一次轉換為JavaFX數據結構。 整個過程幾乎是一個Java語句。
SQL和Java完全分開
正如我們之前在此博客上所寫的那樣, 將上述方法與LINQ或JPQL的DTO提取功能進行比較時 ,存在非常重要的區別。 即使我們在一個語句中表示整個轉換,SQL查詢還是與Java內存中的數據轉換完全分開的。
在表達對數據庫SQL查詢時,我們希望盡可能精確,以便能夠計算最佳執行計劃。 只有實現了數據集之后,Java 8 Stream轉換才會啟動。
當我們將上述與SQL-92兼容的查詢更改為使用令人敬畏的窗口函數的與SQL-1999兼容的查詢時,這一點的重要性就清楚了。 上面的語句的jOOQ部分可以由以下查詢代替:
DSL.using(connection).select(COUNTRIES.YEAR,COUNTRIES.CODE,COUNTRIES.GOVT_DEBT).from(COUNTRIES).orderBy(avg(COUNTRIES.GOVT_DEBT).over(partitionBy(COUNTRIES.CODE)),COUNTRIES.CODE,COUNTRIES.YEAR);…或在SQL中:
selectCOUNTRIES.YEAR,COUNTRIES.CODE,COUNTRIES.GOVT_DEBT fromCOUNTRIES order byavg(COUNTRIES.GOVT_DEBT) over (partition by COUNTRIES.CODE),COUNTRIES.CODE,COUNTRIES.YEAR如您所見,運行此類報告時,至關重要的是要控制實際SQL語句。 這樣,您根本不可能通過窗口函數通過嵌套選擇將排序重構為效率更高的排序。 更不用說重構數十行Java排序邏輯了。
是的 很難擊敗窗口功能的美麗
如果我們添加一些其他的JavaFX樣板文件以將圖表放入窗格,場景和舞臺中,我們將在下面獲得這些漂亮的圖表:
帶有JavaFX和jOOQSQL
自己玩
您可以自己下載并運行上述示例。 只需下載以下示例并運行mvn clean install : https : //github.com/jOOQ/jOOQ/tree/master/jOOQ-examples/jOOQ-javafx-example
翻譯自: https://www.javacodegeeks.com/2015/01/transform-your-sql-data-into-charts-using-jooq-and-javafx.html
jooq sql
總結
以上是生活随笔為你收集整理的jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的底层是什么语言(linux的
- 下一篇: java不支持发行版本12_主要发行版本