程序员个人博客网站,wordpress 视差效果,哪学网页设计好,wordpress可视化编辑器推荐在Data Geekery #xff0c;我们喜欢Java。 而且#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL #xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 对于Java 8系列 #xff0c;我们很荣幸主持Iu Ming-Yee Iu博士发表的非常相关的嘉宾帖子。 Iu … 在Data Geekery 我们喜欢Java。 而且由于我们真的很喜欢jOOQ的流畅的API和查询DSL 我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 对于Java 8系列 我们很荣幸主持Iu Ming-Yee Iu博士发表的非常相关的嘉宾帖子。 Iu Ming-Yee博士在EPFL获得了Java数据库查询博士学位。 他创建了开源项目Jinq以演示一些支持Java中数据库查询的新技术。 我们的社论注释 自从Erik Meijer将LINQ引入.NET生态系统以来我们Java的人们一直在想是否可以拥有相同的东西。 之前我们已经写过几次有关此主题的博客 Java 8仍然需要LINQ吗 还是比LINQ更好 LINQ和Java Java Streams Preview与.Net LINQ Java是否将LINQ添加到JSR-341中的EL 3.0 什么时候用Java编写LINQ 尽管Java生态系统中的大多数LINQesque API都以内部特定于域的语言如jOOQ运行 但有些人却尝试在字节码级别上解决集成问题例如JaQu 。 JINQ通过Iu Ming-Yee Iu博士所说的符号执行来形式化运行时字节码转换。 我们发现这一点非常有趣以至于我们不知道是否应该开始构建JINQ到jOOQ的JINQ提供程序在该提供程序中Java 8 Streams API的表达能力可以与我们强大的SQL标准化和转换功能结合起来吗 说服自己 Java 8 GoodieJava 8将彻底改变数据库访问 Java 8终于来了 经过多年的等待Java程序员最终将获得对Java函数式编程的支持。 功能编程支持有助于简化现有代码同时为Java语言提供强大的新功能。 这些新功能将干扰的一个方面是程序员如何使用Java处理数据库。 功能编程支持为更简单但功能更强大的数据库API开辟了令人兴奋的新可能性。 Java 8将提供新的方法来访问与其他编程语言例如C的LINQ竞争的数据库。 处理数据的功能方式 Java 8不仅为Java语言增加了功能支持而且还通过使用数据的新功能方式扩展了Java集合类。 传统上使用Java处理大量数据需要大量循环和迭代器。 例如假设您有一个Customer对象的集合 CollectionCustomer customers; 如果您只对来自比利时的客户感兴趣则必须遍历所有客户并保存所需的客户。 CollectionCustomer belgians new ArrayList();
for (Customer c : customers) {if (c.getCountry().equals(Belgium))belgians.add(c);
} 这需要五行代码。 它的抽象性也很差。 如果您有1000万客户并且希望通过使用两个线程并行过滤代码来加快代码处理速度会发生什么情况 您将不得不重写所有内容以使用期货和许多冗长的多线程代码。 使用Java 8您可以在一行中编写相同的代码。 借助对函数式编程的支持Java 8使您可以编写函数说出您对哪些客户感兴趣来自比利时的客户然后使用该函数过滤集合。 Java 8有一个新的Streams API可让您执行此操作。 customers.stream().filter(c - c.getCountry().equals(Belgium)
); Java 8版本的代码不仅更短而且代码也更易于理解。 几乎没有样板。 该代码调用方法filter() 因此很明显该代码用于过滤客户。 您不必花时间尝试在循环中破译代码以了解其对数据的处理方式。 如果要并行运行代码会发生什么 您只需要使用其他类型的流。 customers.parallelStream().filter(c - c.getCountry().equals(Belgium)
); 更令人兴奋的是这种功能性的代码样式也适用于数据库 使用数据库的功能方式 传统上程序员需要使用特殊的数据库查询语言来访问数据库中的数据。 例如下面是一些JDBC代码用于查找比利时的所有客户 PreparedStatement s con.prepareStatement(SELECT * FROM Customer C WHERE C.Country ? );
s.setString(1, Belgium);
ResultSet rs s.executeQuery(); 许多代码都是字符串形式的编译器无法检查字符串并且由于草率的编码可能导致安全问题。 还有很多样板代码使得编写数据库访问代码非常繁琐。 jOOQ之类的工具通过提供可以使用特殊Java库编写的数据库查询语言来解决错误检查和安全性问题。 或者您可以使用对象关系映射器之类的工具为常见的访问模式隐藏许多无聊的数据库代码但是如果您需要编写非平凡的数据库查询则仍然需要再次使用特殊的数据库查询语言。 使用Java 8可以使用与Streams API相同的功能样式编写数据库查询。 例如 Jinq是一个开源项目探讨了未来的数据库API如何利用功能编程。 这是使用Jinq编写的数据库查询 customers.where(c - c.getCountry().equals(Belgium)
); 该代码与使用Streams API的代码几乎相同。 实际上Jinq的未来版本将使您可以直接使用Streams API编写查询。 运行代码时Jinq会自动将代码转换为数据库查询就像前面显示的JDBC查询一样。 因此无需学习新的数据库查询语言就可以编写高效的数据库查询。 您可以使用与Java集合相同的代码样式。 您也不需要特殊的Java编译器或虚拟机。 所有这些代码都使用普通的Java 8 JDK进行编译和运行。 如果您的代码中有错误则编译器会发现它们并将其报告给您就像普通的Java代码一样。 Jinq支持与SQL92一样复杂的查询。 支持选择投影联接和子查询。 将Java代码转换为数据库查询的算法在接受和转换何种代码方面也非常灵活。 例如尽管Jinq很复杂但将下面的代码转换为数据库查询没有问题。 customers.where( c - c.getCountry().equals(Belgium) ).where( c - {if (c.getSalary() 100000)return c.getSalary() c.getDebt();elsereturn c.getSalary() 2 * c.getDebt();} ); 如您所见Java 8中的功能编程支持非常适合编写数据库查询。 查询是紧凑的并且支持复杂的查询。 内部工作 但是这一切如何运作 普通的Java编译器如何将Java代码转换为数据库查询 Java 8有什么特别之处可以实现这一点 支持这些新的功能样式数据库API的关键是一种字节码分析称为符号执行。 尽管您的代码是由普通的Java编译器编译并在普通的Java虚拟机中运行的但是Jinq能够在运行时分析已编译的Java代码并从中构造数据库查询。 在分析小功能时符号执行效果最好这在使用Java 8 Streams API时很常见。 理解此符号执行的工作原理的最简单方法是一个示例。 让我们研究一下Jinq如何将以下查询转换为SQL查询语言 customers.where( c - c.getCountry().equals(Belgium) ) 最初 customers变量是一个代表此数据库查询的集合 SELECT *FROM Customers C 然后调用where()方法并将一个函数传递给它。 在这种where()方法中Jinq打开函数的.class文件并获取编译后的字节码供函数分析。 在此示例中我们不使用实际的字节码而只是使用一些简单的指令来表示函数的字节码 d c.getCountry e “比利时” e d.equalse 返回e 在这里我们假设该函数已被Java编译器编译为四个指令。 这是Jinq在调用where()方法时看到的。 Jinq如何理解此代码 Jinq通过执行代码来分析代码。 Jinq不会直接运行代码。 它“抽象地”运行代码。 Jinq在执行代码时不使用实变量和实值而是使用符号来表示所有值。 这就是为什么将分析称为符号执行的原因 。 Jinq执行每条指令并跟踪程序状态中所有副作用或代码更改的所有事物。 下图显示了Jinq使用符号执行来执行四行代码时发现的所有副作用。 符号执行示例 在该图中您可以看到在执行第一条指令之后Jinq如何发现两个副作用变量d发生了变化并且调用了Customer.getCountry()方法。 在执行符号时不会给变量d像“美国”或“丹麦”那样的真实值。 它被分配了c.getCountry()的符号值。 在象征性地执行了所有指令之后Jinq修剪了副作用。 由于变量d和e是局部变量因此在函数退出后对它们的任何更改都将被丢弃因此可以忽略那些副作用。 Jinq还知道 Customer.getCountry()和String.equals()不会修改任何变量或显示任何输出因此也可以忽略这些方法调用。 由此Jinq可以得出结论执行该函数只会产生一种效果它返回c.getCountry().equals(Belgium) 。 一旦Jinq理解了where()方法中传递给它的函数的功能后它便可以将此知识与customers集合基础的数据库查询合并以创建新的数据库查询。 生成数据库查询 这就是Jinq从您的代码生成数据库查询的方式。 使用符号执行意味着这种方法对于不同Java编译器输出的不同代码模式非常健壮。 如果Jinq遇到带有副作用的代码而这些副作用是使用数据库查询无法模拟的那么Jinq将保持您的代码不变。 由于所有内容都是使用常规Java代码编写的因此Jinq可以直接直接运行该代码您的代码将产生预期的结果。 这个简单的翻译示例应该使您了解查询翻译的工作方式。 您应该对这些算法可以从您的代码正确生成数据库查询充满信心。 美好的未来 我希望我对Java 8如何启用Java中使用数据库的新方式有所帮助。 Java 8中的功能性编程支持使您可以类似于编写用于Java集合的代码的方式来编写数据库代码。 希望现有数据库API不久将得到扩展以支持这些查询样式。 要使用这些新型查询的原型您可以访问http://www.jinq.org 翻译自: https://www.javacodegeeks.com/2014/03/java-8-friday-java-8-will-revolutionize-database-access.html