博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过Jinq简化数据库查询
阅读量:5807 次
发布时间:2019-06-18

本文共 1927 字,大约阅读时间需要 6 分钟。

Jinq库为数据库查询提供了一个DSL,。这个项目的灵感来源于.NET的LINQ,致力于提供易于编写的查询,同时支持类型安全。据这个工具的创建者Ming-Yee Iu介绍,,当时的名称为Queryll,但是直到采用了Java 8的lambdas,才完全发挥出了它的潜力。

\\

跟其他已有的库不同,Jinq并无意提供完整的数据访问功能:Jinq只是一个查询工具,因此用于从数据库中获取数据。数据操作,不管是插入、修改还是删除,都依然需要开发人员采用其他的机制。基于这个原因,Jinq提供了与其他最流行的数据库访问库联合使用的支持,包括所有(如Hibernate或EclipseLink)与。

\\

鉴于它不能作为已有库的替代品,有些用户可能就会怀疑Jinq所带来的附加价值是什么。为了尝试并展现它的价值何在,我们用不同的工具来对比一个相同的查询。

\\

我们考虑一个由世界各个国家和城市所组成的数据库。假设我们需要获取首都人口在300万以上的国家列表。对应的SQL查询会如下所示:

\\
`SELECT country.name\FROM country\JOIN city ON country.capital_id = city.id\WHERE city.population \u0026gt; 3000000`
\\

假设采用典型的映射和配置,同等功能的查询使用Hibernate会如下所示:

\\
\`List = session.createQuery(\"SELECT country.name \" +\        \"FROM country JOIN city \" +\        \"WHERE city.population \u0026gt; 3000000\")\        .list();` \
\\

我们可以看到,HQL能够消除掉一些查询中的复杂性,但它依然还是在一个字符串之中,这意味着它可能会包含一些潜在的错误,而这些错误只能在运行期才能发现。接下来看一下,如果使用jOOQ的话,该怎样编写这个查询:

\\
`Result result = create.select(COUNTRY.NAME)\        .from(COUNTRY)\        .join(CITY).on(COUNTRY.CAPITAL_ID.equal(CITY.ID))\        .where(CITY.POPULATION.gt(3000000))\        .fetch();`
\\

这给程序员提供了一种更高级别的类型安全性,引用错误的域、表或操作将会导致编译错误。但是,这个代码依然不够流畅。最后,我们来看一下使用Jinq的函数式方法该如何编写这个查询:

\\
\`List = streams.streamAll(em, City.class)\        .where(c -\u0026gt; c.getCountry().getCapital().equals(c)\                \u0026amp;\u0026amp; c.getPopulation() \u0026gt; 3000000)\        .select(c -\u0026gt; c.getCountry().getName())\        .toList();` \
\\

这个代码非常类似于开发人员使用流数据时所创建的典型结构,这允许他们在编码的时候,保持一种函数式的编程风格。在内部,尽管它看起来像是使用流,但Jinq会使用一种名为“符号执行(symbolic execution)”的技术,将上述的代码转换为实际的SQL查询,而这些SQL查询,数据库是能够进行优化的。

\\

在字节码级别,当到达这块代码的时候,Jinq并不会直接执行。Jinq将会检查不同的步骤,并计算这些步骤会给传入数据所带来的副作用,这就是所谓的符号执行。一旦这些组合的副作用计算完毕,它就会转换为同等作用的SQL查询。如果所计算的副作用对于Jinq来说过于复杂,无法转换为SQL,那么它会作为正常的Java代码来执行,这意味着会得到相同的结果,但是性能可能会稍差一些。

\\

在Java开发社区,一直想要有一个能够与.NET的LINQ功能对等的Java实现。由于语言设计的限制,这可能永远无法完全实现:像C#这样的.NET语言实现,在定义级别进行了修正,以便于让LINQ集成到语言之中,在这方面,Java的架构师是一直反对的。基于该原因,Jinq可能是最为接近的类似方案了。

\\

查看英文原文:

转载地址:http://ueubx.baihongyu.com/

你可能感兴趣的文章
如何理解EM算法
查看>>
nginx 域名跳转一例~~~(rewrite、proxy)
查看>>
linux用户家目录无损迁移到独立硬盘
查看>>
文件查找
查看>>
shell编程前言(一)
查看>>
5、centos7.*配置yum的EPEL源及其它源
查看>>
JSON前后台简单操作
查看>>
shell中一些常见的文件操作符
查看>>
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>
使用第三方类、库需要注意的正则类RegexKitLite的使用
查看>>
iOS \U7ea2 乱码 转换
查看>>
FCN图像分割
查看>>
ios xmpp demo
查看>>
设计模式之-工厂模式、构造函数模式
查看>>
python matplotlib 中文显示参数设置
查看>>
数据库事务隔离级别
查看>>
os模块大全详情
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
从内积的观点来看线性方程组
查看>>