jooq sql

最近,我们已经展示了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和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数据转换为图表相关推荐

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

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

  2. jooq sql_用jOOQ用Java编写SQL

    jooq sql jOOQ是"数据库优先"类型的安全SQL API,使您可以直观地用Java编写SQL,就像Java编译器本身支持SQL语言一样. 所有数据库模式,表,列,过程和其 ...

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

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

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

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

  5. 现宣布Windows Azure中SQL数据同步的增强功能

    我们很高兴宣布SQL数据同步服务迎来了更新,现可以在所有Windows Azure数据中心中操作.过去的两次更新(六月.八月)除了为预览版带来一般可靠性的改进外,还带来了如下的增强功能: ·      ...

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

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

  7. 编程python怎么读-python怎么读sql数据?

    python中读取SQL数据的方法: python中可以使用游标cursor来读取SQL中的数据,游标cursor是由连接创建的对象,可以在游标中执行查询,并设置数据返回的格式. 当执行select语 ...

  8. python语法怎么读-python怎么读sql数据?

    python中读取SQL数据的方法: python中可以使用游标cursor来读取SQL中的数据,游标cursor是由连接创建的对象,可以在游标中执行查询,并设置数据返回的格式. 当执行select语 ...

  9. 通过日志恢复MS SQL数据案例

     [导读]本文介绍通过日志恢复MS SQL数据案例,以数据库的故障恢复改为非简单模式,去掉自动关闭和自动收缩两个选项为前提. 前提条件是数据库的故障恢复改为非简单模式,去掉自动关闭和自动收缩两个选项. ...

最新文章

  1. OpenAI新研究:扩散模型在图像合成质量上击败BigGAN,多样性还更佳
  2. 网站seo不能错过这几点!
  3. html5倒计时秒杀怎么做,vue 设计一个倒计时秒杀的组件
  4. 滴滴算法大赛算法解决过程 - 拟合算法
  5. 台式计算机m9870t,JBT9870_水力测功器最新标准规范(14页)-原创力文档
  6. 数据预处理(Python scikit-learn)
  7. Eight Machine Learning JavaScript Frameworks to Explore
  8. 轻快的VIM(三):删除
  9. OpenCV_(Laplacian Transform to find the edges)图像拉普拉斯变换查找边缘 图像识别
  10. c++求100以内素数
  11. 《嵌入式 - 语音识别TWen-ASR-ONE开发笔记》第2章 TWen-ASR-ONE开发环境搭建与使用
  12. 苹果再推7寸超级iPhone7,iPad何去何从?
  13. C语言开发必会 宏定义、宏函数
  14. 【第66篇】行人属性识别研究综述(一)
  15. 51nod 1326 遥远的旅途
  16. 每天工作3小时就够了
  17. springboot项目层次结构_【SpringBoot】多模块项目结构搭建
  18. 北京内推 | 阿里Lazada广告技术团队招聘推荐广告算法工程师
  19. access数据库剔除重复项_access数据库查询时如何让查出来的数据自动去除重复项...
  20. Multisim仿真—稳压电路(一)

热门文章

  1. jzoj3056-数字【数位dp,统计,容斥】
  2. 欢乐纪中某B组赛【2019.1.25】
  3. NOIP2013货车运输
  4. SpringBoot2.1.9 分布式锁ShedLock
  5. 深度分析Java的ClassLoader机制(源码级别)
  6. 关于区块链技术的10本书
  7. No services have been found解决方案
  8. 看了通信领域中信息的处理的三种方式我终于知道电报能发送信息的原理了
  9. Math中的常用方法
  10. 量子计算机对人类长寿,科学家称“极端长寿”在未来几十年可能会达到新的里程碑...