最近,我们已经展示了Java 8和函数式编程将如何为使用jOOQ和Java 8 lambda和Streams进行SQL数据的函数数据转换为Java开发人员带来新的视角。 今天,我们将这一步骤更进一步,将数据转换为JavaFX XYChart.Series以根据数据生成美观的条形图。

设置数据库

我们将在PostgreSQL数据库中再次使用世界银行开放数据的一小部分。 我们正在使用的数据如下:

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

( 另请参阅本文,了解针对上述数据的另一套很棒的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和jOOQ的SQL

自己玩

您可以自己下载并运行上面的示例。 只需下载以下示例并运行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和JavaFX将SQL数据转换为图表相关推荐

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

    jooq sql 最近,我们已经展示了Java 8和函数式编程将如何为使用jOOQ和Java 8 lambda和Streams进行SQL数据的函数数据转换为Java开发人员带来新的视角. 今天,我们将 ...

  2. 把Sql数据转换为业务数据的几种方法

    ORM系统必须把数据库中的数据转换为业务数据,转换的方法大致有3种,本文就试图对它们做一些简单分析. 1.属性反射.就是通过反射,获取业务实体类的各个属性,然后再设置这些属性的值.这个方法最简单.最稳 ...

  3. Python将JSON格式数据转换为SQL语句以便导入MySQL数据库

    前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据.我们希望把这些数据导入到MySQL数据库中.phpMyadmin能够把MySQL数据库中的数据导出为JSON格式文件,但却 ...

  4. 【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. xml转换为mysql_如何将存储在XML文件中的数据转换为关系数据库(MySQL)?

    我有一些 XML文件包含研究项目的数据,我需要运行一些统计数据.数据量接近100GB. 结构不是那么复杂(可能映射到关系模型中的10个表),并且考虑到问题的性质,这些数据永远不会再次更新,我只需要在易 ...

  6. sql数据类型转换(cast() and convent())函数)

    sql数据类型转换(cast() and convent())函数) sql数据类型转换(cast() and convent())函数) 当 Microsoft® SQL Server™ 2000 ...

  7. 使用FoundationDB高效地将SQL数据映射到NoSQL存储系统中

    NoSQL数据库 --FoundationDB的键-值存储系统 FoundationDB是一个分布式的键-值存储系统,支持全局ACID事务操作,并且性能出众.在安装系统时,可以指定数据分发的级别.数据 ...

  8. sql数据类型转换oracle,ORACLE SQL数据类型转换

    ORACLE SQL数据类型转换 开发工具与关键技术:Oracle sql*plus PLSQL Developer 撰写时间:2019年3月25日 下面要说的是,如何将不同类型的数据进行转换处理 这 ...

  9. Power BI 将商业智能数据转换为数据理解

    l  研究数据 在本部分中你要了解各种知识,并且积极的互动和进行 Power BI 共享在这一部分至关重要. Power BI 服务简介 Power BI 服务是 Power BI Desktop 的 ...

最新文章

  1. 非侵入脑机接口新突破!用意念控制光标,连续追踪效果提升5倍
  2. php 多个单选怎么办,【大神看过来】根据一个用PHP做的单选投票,改成多选,且可显示...
  3. Windows下MariaDB数据库安装图文教程
  4. Ubuntu中运行pip时报错
  5. Oracle10.2.0.1.0升级Oracle10.2.0.2.0补丁安装指南(转载)
  6. 规模化微服务——《微服务设计》读书笔记
  7. Dynamips结合VMware搭建站点到站点×××环境
  8. 2020年日历电子版(打印版)_灵感 | 快来康康——2020年的日历设计的这么有创意?...
  9. 360优化开机速度后慢了_提高电脑开机速度的优化技巧
  10. testng 监听器_TestNG侦听器
  11. Libre-SOC 系统级芯片
  12. RHCE 第三讲 文件系统
  13. 小米路由器刷梅林教程_小米路由器3刷X-Wrt固件教程
  14. 14届数独-真题标准数独-Day 3-20220118
  15. flyway java使用_Flyway的Java原生版操作
  16. OJ期末刷题 问题 B: 求三角形面积-gyy
  17. android自动接收并填充短信验证码
  18. 计算机辅助项目管理实验论文,计算机辅助项目管理课程设计—毕设论文.doc
  19. 雷神笔记本关闭触摸板
  20. VS2008 Debug Error R6034

热门文章

  1. 如何在Intellij IDEA中集成Gitlab
  2. linux下q和q 的区别,linux命令中q、wq、q!的区别
  3. php如何直接使用iview,iview安装使用
  4. oidc auth2.0_将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成
  5. java 字符串文字筛选_重新开始Java的原始字符串文字讨论
  6. javaone_JavaOne 2016后续活动
  7. jcmd_程序化JCMD访问
  8. java写入单个字符_将2个字符写入单个Java char
  9. 众神进入瓦尔哈拉_一时冲动:“通往瓦尔哈拉之路的冒险”
  10. jax-rs jax-ws_JAX-RS 2.x与Spring MVC:返回对象列表的XML表示