www.3158sun.com / 注册
www.3158sun.com
IT168首页 > www.3158sun.com > 大数据技术 > 正文

gk888t:如何使用Java Streams进行数据库查询?

2018-09-14 15:36    it168网站 原创  作者: 刘美利 编辑: 刘美利
本文来源:http://www.247338.com/learning_sohu_com/

www.3158sun.com,也是在这段时间内,GoPro公司出现了季度业绩的连续亏损,两次裁员不仅仅是对之前业务布局的调整,也是为了止损。但在烧钱、补贴、砸流量、抢用户等混战背后,用户能够持续选择的入口是有限的,因此外卖平台必须步步为营,连淘点点这样的“富二代”在过去也未能有所作为,可见外卖平台的项目难度系数之大。我在找钱过程中,对于好的VC是极为珍惜的。  我当时说网易有用户,有邮箱,有免费个人主页,如果我们每月从一个用户身上赚一块钱,那我们公司就能实现赢利持平。

  文/新浪财经意见领袖专栏(微信公众号kopleader)专栏作家徐高    供给侧改革是2016年宏观政策的主轴,年内主要经济任务均围绕“去产能、去库存、去杠杆、降成本、补短板”这五大任务展开。行情12月07日【广西IT前线今日报道】惠普Pavilion14-AL131TX搭载第七代英特尔#174;酷睿i5-7200U处理器,采用KabyLake架构,运用成熟的14纳米工艺,功耗较第六代更低。行情12月07日【广西IT前线今日报道】惠普Pavilion14-AL131TX搭载第七代英特尔#174;酷睿i5-7200U处理器,采用KabyLake架构,运用成熟的14纳米工艺,功耗较第六代更低。记者就此问过某国外润滑油品牌负责人,他表示:“这涉及运费、物流、渠道等环节,问题太大,不做讨论。

同时英雄互娱也披露,目前王思聪没有持有英雄互娱任何股份。  主要财政和货币政策:1953年7月签订朝鲜停战协定;削减财政开支,尤其军费开支;修订《美国联邦税法典》(1954),追求周期性预算平衡。行情12月07日【广西IT前线今日报道】惠普Pavilion14-AL131TX搭载第七代英特尔#174;酷睿i5-7200U处理器,采用KabyLake架构,运用成熟的14纳米工艺,功耗较第六代更低。行情12月07日【广西IT前线今日报道】惠普Pavilion14-AL131TX搭载第七代英特尔#174;酷睿i5-7200U处理器,采用KabyLake架构,运用成熟的14纳米工艺,功耗较第六代更低。

  【IT168 技术】本文介绍了如何编写能够处理现有数据库数据的Java应用程序,而无需编写单行SQL(或类似语言)代码,也无需浪费时间将所有的内容组合在一起。在您的应用程序准备就绪之后,您可以通过添加两行代码,使用in-JVM-acceleration加速性能。

  本文,我们使用Speedment框架,可以直接从数据库模式生成代码,并可以自动将Java Streams生成SQL,您可以使用Java编写代码。

  示例数据库

  我们使用的示例数据库是Sakila。它有Film(影片), Actor(演员), Category(类别)等表格,下载地址:/dev_mysql_com/doc/index-other.html 。

  步骤一:连接数据库

  我们使用 Speedment Initializer 配置pom.xml文件,点击下载后,将得到一个带有自动生成Main.java文件的项目文件夹。

  然后,解压文件夹zip.,打开命令行,然后转到pO.xml文件所在的位置。输入以下命令:

  mvn speedment:tool

  Speedment将被启动,会提示您输入授权码。选择“Start Free”,您将获得免费许可。然后便可以连接数据库开始使用。

  步骤二:生成代码

  当数据库开始加载schema data时,便可以点击"Generate"生成完整的Java域模型。

  步骤三:编写应用程序代码

  步骤二中还会自动生成一个Speedment的生成器。打开Main.java文件,将main()方法中的代码替换成以下代码:

  SakilaApplication app = new SakilaApplicationBuilder()

   .withPassword("sakila-password") /Replace with your own password

   .build();

  接下来,我们将编写一个打印出所有影片的应用程序。当然这只是一个小程序,我们还要对其进行改进。

  /Obtains a FilmManager that allows us to

  /work with the "film" table

  FilmManager films = app.getOrThrow(FilmManager.class);

  /Create a stream of all films and print

  /each and every film

  films.stream()

   .forEach(System.out::println);

  运行时,Java stream将自动生成SQL。为了查看SQL代码,需要修改Application Builder,并使用STREAM日志类型开启日志记录。

  SakilaApplication app = new SakilaApplicationBuilder()

   .withPassword("sakila-password")

   .withLogging(ApplicationBuilder.LogType.STREAM)

   .build();

  以下是运行应用程序时的SQL代码:

  SELECT

   `film_id`,`title`,`description`,`release_year`,

   `language_id`,`original_language_id`,`rental_duration`,`rental_rate`,

   `length`,`replacement_cost`,`rating`,`special_features`,`last_update`

  FROM

   `sakila`.`film`,

  values:[]

  SQL代码会因您选择的数据库类型而异(例如MySQL,MariaDB,PostgreSQL,Oracle,MS SQL Server,DB2,AS400等),且这些变化都是自动的。

  上面的代码将产生以下输出(简洁为主)

  FilmImpl { filmId = 1, title = ACADEMY DINOSAUR, ..., length = 86, ... }

  FilmImpl { filmId = 2, title = ACE GOLDFINGER, ..., length = 48, ...}

  FilmImpl { filmId = 3, title = ADAPTATION HOLES, ..., length = 50, ...}

  ...

  步骤四:使用过滤器

  Speedment流包括过滤器在内的所有流操作。假设我们只想过滤掉那些超过60分钟的影片,可以通过以下代码来实现:

  films.stream()

   .filter(Film.LENGTH.greaterThan(60))

   .forEach(System.out::println);

  生成SQL:

  SELECT

   `film_id`,`title`,`description`,`release_year`,

   `language_id`,`original_language_id`,`rental_duration`,`rental_rate`,

   `length`,`replacement_cost`,`rating`,`special_features`,

   `last_update`

  FROM

   `sakila`.`film`

  WHERE

   (`length` > ?),

  values:[60]

  生成输出:

  FilmImpl { filmId = 1, title = ACADEMY DINOSAUR, ..., length = 86, ... }

  FilmImpl { filmId = 4, title = AFFAIR PREJUDICE, ..., length = 117, ...}

  FilmImpl { filmId = 5, title = AFRICAN EGG, ... length = 130, ...}

  可以通过组合过滤器来创建更复杂的表达式,如下所示:

  films.stream()

   .filter(

    Film.LENGTH.greaterThan(60).or(Film.LENGTH.lessThan(30))

  )

   .forEach(System.out::println);

  这将回收掉那些不到30分钟或者超过一小时的影片。这时检查您的日志文件,您将发现这个流已生成SQL。

  步骤五:定义元素的顺序

  默认情况下,出现在流中的元素是未被定义的。想要定义一个特定顺序,您需要将SORTED()操作应用到这样的流:

  films.stream()

   .filter(Film.LENGTH.greaterThan(60))

   .sorted(Film.TITLE)

   .forEach(System.out::println);

  生成SQL

  SELECT

   `film_id`,`title`,`description`,`release_year`,

   `language_id`,`original_language_id`,`rental_duration`,`rental_rate`,

   `length`,`replacement_cost`,`rating`,`special_features`,

   `last_update`

  FROM

   `sakila`.`film`

  WHERE

   (`length` > ?)

  ORDER BY

   `length` ASC,

  values:[60]

  生成输出:

  FilmImpl { filmId = 77, title = BIRDS PERDITION,..., length = 61,...}

  FilmImpl { filmId = 106, title = BULWORTH COMMANDMENTS,..., length = 61,}

  FilmImpl { filmId = 114, title = CAMELOT VACATION,..., length = 61,..}

  ...

  您还可以组合多种分类机来定义主顺序、次顺序等。

  films.stream()

   .filter(Film.LENGTH.greaterThan(60))

   .sorted(Film.LENGTH.thenComparing(Film.TITLE.reversed()))

   .forEach(System.out::println);

  这将按照LENGTH顺序(升序)和TITLE顺序(降序)对影片元素进行排序。您可以对数量字段进行任意组合。

  注意:如果您按升序组成两个或两个以上字段时,你应该使用.comparator(). I.e.字段方法。例如:sorted(Film.LENGTH.thenComparing(Film.TITLE.comparator()))。

  步骤六:避免大对象块(Large Object Chunks)

  人们一般会对结果进行分页来避免使用不必要的大对象块(Large Object Chunks)。假设我们希望在每页看到50个元素,我们可以通过以下代码来实现:

  private static final int PAGE_SIZE = 50;

  public staticStreampage(

   Managermanager,

   Predicate predicate,

   Comparator comparator,

   int pageNo

  ) {

   return manager.stream()

    .filter(predicate)

    .sorted(comparator)

    .skip(pageNo * PAGE_SIZE)

    .limit(PAGE_SIZE);

  }

  该方法可以使用任意过滤器对任意表进行随意排序。

  例如,调用:

  page(films, Film.LENGTH.greaterThan(60), Film.TITLE, 3)

  将回收掉那些超过60分钟的影片流,并按照第三页的标题进行排序(即,跳过150部影片并显示以下50部影片)。

  生成SQL

  SELECT

   `film_id`,`title`,`description`,`release_year`,

   `language_id`,`original_language_id`,`rental_duration`,`rental_rate`,

   `length`,`replacement_cost`,`rating`,`special_features`,

   `last_update`

  FROM

   `sakila`.`film`

  WHERE

   (`length` > ?)

  ORDER BY

   `title` ASC

  LIMIT ? OFFSET ?,

  values:[60, 50, 150]

  生成输出

  FilmImpl { filmId = 165, title = COLDBLOODED DARLING, ... length = 70,...}

  FilmImpl { filmId = 166, title = COLOR PHILADELPHIA, ..., length = 149... }

  FilmImpl { filmId = 167, title = COMA HEAD, ... length = 109,...}

  ...

  同样,如果我们使用了另一种数据库类型,那么SQL代码就会不同。

  步骤七: In-JVM-Memory加速

  由于您在初始化程序中使用了标准配置,所以In-JVM-memory加速在POM.XML文件中就被启动。如果要激活应用程序中的加速,只需要将初始代码修改成如下代码:

  SakilaApplication app = new SakilaApplicationBuilder()

   .withPassword("sakila-password")

   .withBundle(InMemoryBundle.class)

   .build();

  /Load data from the database into an in-memory snapshot

  app.getOrThrow(DataStoreComponent.class).load();

  现在,表流将直接在RAM中被提供,而不是生成SQL查询。内存索引也将加速过滤、排序和跳过。内存表和索引都储存在堆外,避免了垃圾回收的延迟。

  • IT168企业级IT168企业级
  • IT168文库IT168文库

扫一扫关注

  • 推荐文章
  • 推荐产品
行车视线文章推荐
?
首页 评论 返回顶部
申博在线娱乐登入 申博代理有限公司登入 申博代理直营网 电子游戏微信支付充值 申博游戏网址 申博138娱乐
申博在线咨询登入 申博在线直营网 申博支付宝充值 菲律宾太阳娱乐登入官网 菲律宾申博官网免费开户 菲律宾太阳城申博
申博正网存取款直营网 申博现金网登入 www.99msc.com 申博138游戏登入 www.666sbo.com 申博太阳城娱乐中心直营网