日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表

發(fā)布時間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

jooq sql

最近,我們已經(jīng)展示了Java 8和函數(shù)式編程將如何為使用jOOQ和Java 8 lambda和Streams進(jìn)行SQL數(shù)據(jù)的函數(shù)數(shù)據(jù)轉(zhuǎn)換為Java開發(fā)人員帶來新的視角。 今天,我們將這一步驟更進(jìn)一步,將數(shù)據(jù)轉(zhuǎn)換為JavaFX XYChart.Series以根據(jù)數(shù)據(jù)生成美觀的條形圖。

設(shè)置數(shù)據(jù)庫

我們將在PostgreSQL數(shù)據(jù)庫中再次使用世界銀行開放數(shù)據(jù)的一小部分。 我們正在使用的數(shù)據(jù)如下:

DROP SCHEMA IF EXISTS world;CREATE SCHEMA world;CREATE TABLE world.countries (code CHAR(2) NOT NULL,year INT NOT NULL,gdp_per_capita DECIMAL(10, 2) NOT NULL,govt_debt DECIMAL(10, 2) NOT NULL );INSERT INTO world.countries VALUES ('CA', 2009, 40764, 51.3),('CA', 2010, 47465, 51.4),('CA', 2011, 51791, 52.5),('CA', 2012, 52409, 53.5),('DE', 2009, 40270, 47.6),('DE', 2010, 40408, 55.5),('DE', 2011, 44355, 55.1),('DE', 2012, 42598, 56.9),('FR', 2009, 40488, 85.0),('FR', 2010, 39448, 89.2),('FR', 2011, 42578, 93.2),('FR', 2012, 39759,103.8),('GB', 2009, 35455,121.3),('GB', 2010, 36573, 85.2),('GB', 2011, 38927, 99.6),('GB', 2012, 38649,103.2),('IT', 2009, 35724,121.3),('IT', 2010, 34673,119.9),('IT', 2011, 36988,113.0),('IT', 2012, 33814,131.1),('JP', 2009, 39473,166.8),('JP', 2010, 43118,174.8),('JP', 2011, 46204,189.5),('JP', 2012, 46548,196.5),('RU', 2009, 8616, 8.7),('RU', 2010, 10710, 9.1),('RU', 2011, 13324, 9.3),('RU', 2012, 14091, 9.4),('US', 2009, 46999, 76.3),('US', 2010, 48358, 85.6),('US', 2011, 49855, 90.1),('US', 2012, 51755, 93.8);

( 另請參閱本文,了解針對上述數(shù)據(jù)的另一套很棒SQL查詢 )

我們現(xiàn)在要做的是在兩個不同的條形圖中繪制兩組值:

  • 2009-2012年間每個國家的人均GDP
  • 2009年至2012年期間,每個國家的債務(wù)占其GDP的百分比

然后,這將創(chuàng)建8個系列,兩個圖表中的每個系列都有四個數(shù)據(jù)點(diǎn)。 除了上述內(nèi)容之外,我們還希望按2009-2012年之間的平均預(yù)測值對系列進(jìn)行排序,以便可以輕松比較系列-進(jìn)而比較國家/地區(qū)。 通過結(jié)果圖表在視覺上進(jìn)行解釋顯然比在文本上進(jìn)行解釋容易,因此請繼續(xù)關(guān)注,直到文章結(jié)尾。

使用jOOQ和JavaFX收集數(shù)據(jù)

我們將編寫以計(jì)算上述數(shù)據(jù)系列的查詢在普通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表中選擇相關(guān)列,就可以自動加入每個國家/地區(qū)的平均預(yù)測值,以便可以按該平均值對結(jié)果進(jìn)行排序。 可以使用窗口函數(shù)來編寫相同的查詢。 我們稍后再講。

我們將編寫以下代碼來使用jOOQ和JavaFX創(chuàng)建這樣的條形圖:

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()) );

真正有趣的是,我們可以從數(shù)據(jù)庫中獲取數(shù)據(jù),然后將其一次轉(zhuǎn)換為JavaFX數(shù)據(jù)結(jié)構(gòu)。 整個過程幾乎是一個Java語句。

SQL和Java完全分開

正如我們之前在此博客上所寫的那樣, 將上述方法與LINQ或JPQL的DTO提取功能進(jìn)行比較時 ,存在非常重要的區(qū)別。 即使我們在一個語句中表示整個轉(zhuǎn)換,SQL查詢還是與Java內(nèi)存中的數(shù)據(jù)轉(zhuǎn)換完全分開的。

在表達(dá)對數(shù)據(jù)庫SQL查詢時,我們希望盡可能精確,以便能夠計(jì)算最佳執(zhí)行計(jì)劃。 只有實(shí)現(xiàn)了數(shù)據(jù)集之后,Java 8 Stream轉(zhuǎn)換才會啟動。

當(dāng)我們將上述與SQL-92兼容的查詢更改為使用令人敬畏的窗口函數(shù)的與SQL-1999兼容的查詢時,這一點(diǎn)的重要性就清楚了。 上面的語句的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

如您所見,運(yùn)行此類報(bào)告時,至關(guān)重要的是要控制實(shí)際SQL語句。 這樣,您根本不可能通過窗口函數(shù)通過嵌套選擇將排序重構(gòu)為效率更高的排序。 更不用說重構(gòu)數(shù)十行Java排序邏輯了。

是的 很難擊敗窗口功能的美麗

如果我們添加一些其他的JavaFX樣板文件以將圖表放入窗格,場景和舞臺中,我們將在下面獲得這些漂亮的圖表:

帶有JavaFX和jOOQSQL

自己玩

您可以自己下載并運(yùn)行上述示例。 只需下載以下示例并運(yùn)行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

總結(jié)

以上是生活随笔為你收集整理的jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。