国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java 8 徹底改變數據庫訪問

開發 后端
Java 8終于到來了! 經過幾年的等待, java程序員終于能在java中得到函數式編程的支持了. 函數式編程的支持能流程化現有的代碼并且為java提供強大的能力.在這些新特性中最矚目的是java程序員對數據庫的操作方式.函數式編程帶來了令人激動的簡便高效的數據庫API. Java 8 將會支持可與C#, LINQ等語言競爭的新的數據庫訪問方式.

Java 8終于到來了! 經過幾年的等待, java程序員終于能在java中得到函數式編程的支持了. 函數式編程的支持能流程化現有的代碼并且為java提供強大的能力.在這些新特性中最矚目的是java程序員對數據庫的操作方式.函數式編程帶來了令人激動的簡便高效的數據庫API. Java 8 將會支持可與C#, LINQ等語言競爭的新的數據庫訪問方式.

處理數據的函數式方式

Java 8 不僅僅添加了函數式支持,它也通過新的函數式處理數據的方式擴展了集合(Collection)類. 而通常情況下java處理大量數據時需要大量的循環和迭代器.

例如, 假設你有一個存儲客戶(Customer)對象的collection:

  1. Collection<Customer>&nbsp;customers; 

如果你只對來自Belgium的客戶感興趣, 你將不得不迭代所有的customer對象并只保存你需要的.

  1. Collection<Customer> belgians = new ArrayList<>();  
  2. for (Customer c : customers) {  
  3.     if (c.getCountry().equals("Belgium"))  
  4.         belgians.add(c);  
  5. }  

這不僅花費了5行代碼,而且它也不怎么抽象.假使你有1千萬個對象時會怎樣呢?你會通過兩個線程并發過濾所有對象來提速么?那你將不得不使用大量危險的多線程代碼來重寫所有代碼.

而通過Java 8,僅僅只需要一行代碼就能實現相同的功能.通過對函數式編程的支持, Java 8 能讓你只寫一個函數表明你對哪些客戶(對象)感興趣然后使用那個函數對集合做過濾就可以了. Java 8 的新 Steams API 支持你這樣做:

  1. customers.stream().filter(  
  2.     c -> c.getCountry().equals("Belgium")  
  3. );  

上面Java 8 版本的代碼不僅更短,而且更容易理解.它幾乎沒有什么 陳詞濫調(循環或迭代器等).代碼調用了filter()方法,那很明顯這段代碼是用來過濾客戶(對象)的.你不需要再把時間浪費在解讀循環中的代碼來理解它在對它的數據做什么.

假使你想并發執行這段代碼該怎么辦呢?你只需使用另一個類型的stream

  1. customers.parallelStream().filter(  
  2.     c -> c.getCountry().equals("Belgium")  
  3. );  

更另人激動的是這種函數式風格的代碼也同樣適用于數據庫

在數據庫上使用函數式方式

傳統上來說, 程序員需要用特殊數據庫查詢語句去訪問數據庫的數據. 例如,下面就是用 JDBC 代碼去查找來自Belgium的客戶:

  1. PreparedStatement s = con.prepareStatement(  
  2.       "SELECT * " 
  3.     + "FROM Customer C " 
  4.     + "WHERE C.Country = ? ");  
  5. s.setString(1"Belgium");  
  6. ResultSet rs = s.executeQuery();  

大部分這些代碼都是字符串, 這樣會使編譯器不能發現錯誤而且這草率的代碼會導致安全問題. 還有這些大量的樣板代碼使得寫數據訪問代碼變得十分冗余. 一些工具例如 jOOQ ,通過使用特殊的java庫去提供數據庫查詢語言可以解決錯誤檢查和安全問題。 或者使用對象關系映射工具可以免去大量的無趣的代碼,可它們只能用在通用訪問查詢, 如果需要復雜的查詢,還是需要用特殊的數據庫查詢語言。

使用Java 8,借助流式API就可以用函數式方式去查詢數據庫了。例如, Jinq 是一個開源的項目,它探索怎樣的未來數據庫API可以令函數式編程成為可能。這里就是一個使用Jinq的數據庫查詢:

  1. customers.where(  
  2.     c -> c.getCountry().equals("Belgium")  
  3. );  

這代碼幾乎跟跟使用流式API的代碼一樣. 事實上,未來的Jinq版本可以讓你用流式API直接寫數據庫查詢。 當代碼運行的時候,Jinq將自動翻譯成數據庫查詢代碼,正如之前JDBC查詢一樣。

這樣的話,就算沒有學過一些新的數據庫查詢語言,你也可以寫出有效率的數據庫查詢。你可以用同樣樣式的代碼用在java集合上。你也不需要特殊的java編譯器或者虛擬機。所有的代碼編譯和運行在普通的java 8 JDK上。如果你的代碼有錯誤,編譯器將找出它們并且報告給你,就像普通的java代碼。

Jinq 支持跟SQL92一樣的復雜查詢. Selection(選擇), projection(投影), joins(連接), 和子查詢 它都支持。翻譯java代碼成數據庫查詢的算法是十分靈活的,只要是它能接受的,都能翻譯。例如,Jinq能夠翻譯下面的數據庫查詢,盡管它很復雜。

  1. customers  
  2.     .where( c -> c.getCountry().equals("Belgium") )  
  3.     .where( c -> {  
  4.         if (c.getSalary() < 100000)  
  5.             return c.getSalary() < c.getDebt();  
  6.         else 
  7.             return c.getSalary() < 2 * c.getDebt();  
  8.         } );  

正如你看到的,java 8 的函數式編程非常適合數據庫查詢。而且查詢緊湊,甚至復雜的查詢也能夠勝任。

內部運作

但這都是如何工作的呢?怎么能讓普通的Java編譯器將Java代碼轉換成數據庫查詢?Java 8 有什么特別之處使這個成為可能?

支持這些函數性風格的新的數據庫PI的關鍵是一種叫做“象征性執行”的字節碼分析手段。雖然你的代碼是被一個普通的Java編譯器編譯的并運行在一個普通的Java虛擬機中,但 Jinq 能夠在你被編譯的Java代碼運行時進行分析并從中構建數據庫查詢。使用 Java 8 Streams API 時,常會發現分析短小的函數時,象征性執行的工作效果***。

要了解這個象征性執行是如何工作的,最簡單的方法是用一個例子。讓我們檢查一下下面的查詢是如何被 Jinq 轉換為SQL查詢語言的:

  1. customers  
  2.     .where( c -> c.getCountry().equals("Belgium") )  

初始時, 變量 customers 是一個集合,其對應的數據庫查詢是:

  1. SELECT *  
  2.   FROM Customers C  

然后,where() 方法被調用,一個函數被傳遞給它。在 where() 方法中,Jinq 打開這個函數的 .class 文件,得到這個函數被編譯成的字節碼進行分析。在這個例子中,不使用真正的字節碼,讓我們用一些簡單的指令來代表這個函數的字節碼:

  1. d = c.getCountry()

  2. e = &#8220;Belgium&#8221;

  3. e = d.equals(e)

  4. return e

在這里,我們假設函數已被Java編譯器編譯成這四條指令。當調用 where() 方法時,Jinq 看到的就是這些。如何才能使Jinq理解這些代碼呢?

Jinq 通過執行代碼來分析。但 Jinq 不直接運行代碼。它是“抽象”地運行代碼:不使用真實的變量和真實的值,Jinq 使用符號來表示執行代碼時的所有值。這就是這個分析為什么被稱為“象征性執行”。

Jinq 執行每條指令,并跟蹤所有的副作用或代碼在程序狀態時改變的所有東西。下面是一個圖表,顯示出 Jinq 用象征性執行方式執行這四行代碼時發現的所有副作用。

 

象征性執行的例子

在圖中,你可以看到***條指令運行后,Jinq 發現了兩個副作用:變量d已經發生了變化,方法 Customer.getCountry() 被調用。由于是象征性執行,變量d沒有給出一個真正的比如是“USA”或“Denmark”的值,它被分配為 c.getCountry() 的象征性的值。

在所有這些指令被象征性執行之后,Jinq 對副作用作精簡。由于變量 d 和 e 是局部變量,它們的任何變化在函數退出后都會被丟棄,所以這些副作用可以忽略不計。Jinq也知道 Customer.getCountry() and String.equals() 方法沒修改任何變量或顯示任何輸出,因此這些方法調用也可以被忽略。由此,Jinq 可以得出這樣的結論:執行這個函數只會產生一個作用,它會返回 c.getCountry().equals("Belgium")。

一旦Jinq已明白在 where()方法中傳遞給它的函數,它可以混合數據庫查詢方面的知識,優先于 customers 集合來創建一個新的數據庫查詢。

 

生成數據庫查詢

這就是 Jinq 如何從你的代碼生成數據庫查詢的。象征性執行的使用意味著,這種方法對于不同的Java編譯器輸出的不同的代碼模式都是相當強大的。如果 Jinq 遇到的代碼有不能轉化為數據庫查詢的副作用,Jinq 將保持你的這些代碼不變。因為一切都是用正常的Java代碼寫的,Jinq 可以直接運行那些代碼,您的代碼將產生預期的結果。

這個簡單的翻譯實例應該讓你明白了怎樣查詢翻譯作品。你可以確信,這些算法可以正確地從你的代碼生成數據庫查詢。

美好前景

我希望我已經讓你品嘗到了Java 8帶來的在Java中進行數據庫工作的新方式。Java 8 支持的函數式編程允許你用和為Java集合編寫代碼同樣的方式來為數據庫寫代碼。希望不久現有的數據庫API都能被擴展以支持這些類型的查詢。

英文原文:Java 8 Friday: Java 8 Will Revolutionize Database Access

譯文鏈接:http://www.oschina.net/translate/java-8-friday-java-8-will-revolutionize-database-access

責任編輯:林師授 來源: 開源中國社區 編譯
相關推薦

2022-04-01 14:43:35

物聯網數字營銷物聯網網絡

2022-12-16 08:00:00

知識圖數據集工具

2024-04-24 11:16:35

邊緣計算數據存儲云服務器

2016-05-04 15:36:41

任意云戴爾微軟

2025-03-07 07:00:00

AI人工智能

2024-02-27 15:28:22

5G技術物聯網IOT

2023-09-22 10:49:54

人工智能

2015-11-23 09:42:33

大數據數據庫

2023-05-04 14:48:25

AR

2018-07-24 11:05:54

邊緣計算網絡云計算

2025-08-08 10:30:00

Eyevinn開源部署

2022-10-26 11:06:16

機器學習農業

2019-06-05 15:54:51

大數據零售分析

2014-09-19 10:44:00

微軟Windows

2023-03-15 10:26:58

物聯網智能建筑數字技術

2020-03-23 20:52:26

物聯網IOT

2022-03-11 14:11:17

區塊鏈物流技術

2023-05-04 09:48:54

機器學習人工智能

2024-03-05 14:43:02

2023-07-24 10:12:04

物聯網IOT
點贊
收藏

51CTO技術棧公眾號

黄色国产一级视频| 国产在线一区观看| **女人18毛片一区二区| 精品久久久网站| 九色丨porny丨| 一广人看www在线观看免费视频| 国产成人综合亚洲网站| 成人精品久久一区二区三区| 国产高清不卡| 欧美日韩国产另类一区| 国产va在线| 久久综合久色欧美综合狠狠| 日韩av电影免费观看| 日韩精品欧美| 欧美极品欧美精品欧美视频| av电影免费在线看| 91成人在线精品| 成人片在线播放| 国产亚洲美州欧州综合国| 中日韩在线视频| 亚洲一区视频| 91精品网站| 精品视频黄色| 欧美一区二区视频97| 久久人人视频| 国产视频一区在线| h片在线观看网站| 日韩欧美亚洲国产一区| 久久久久久久久久久久久久国产| 久久精品国产一区二区三区免费看| 91精品视频在线免费观看| 国产精品成人一区二区艾草 | 激情成人中文字幕| 日本国产中文字幕| 日本麻豆一区二区三区视频| 国产精品三区四区| 国产精品久久久久久五月尺 | 欧美中文字幕一二三区视频| 欧美成人黑人| 精品免费国产二区三区| 999久久精品| 亚州成人av在线| 精品福利一区| 91国产视频在线播放| 日韩中文字幕一区二区高清99| 久久精品国产亚洲一区二区 | 亚州av电影免费在线观看| 亚洲综合激情小说| 色就是色亚洲色图| 日韩欧美一区视频| 国产suv精品一区二区四区视频| 欧美一级在线亚洲天堂| 久久99热狠狠色一区二区| 激情五月婷婷六月| 久久久久久久久久看片| 欧美精品久久久久久久久25p| 国产精品乱码人人做人人爱 | 中文字幕一区综合| 欧美日韩精品是欧美日韩精品| 一个色免费成人影院| 国产日韩欧美日韩| 午夜影院日韩| 免费男女羞羞的视频网站主页在线观看 | 一片黄亚洲嫩模| av自拍一区| 欧美变态另类刺激| 自拍偷拍欧美激情| 欧美91精品久久久久国产性生爱| 色哟哟亚洲精品| 欧美日韩经典丝袜| 精品国偷自产在线| 国产一区在线视频| 特级毛片在线| 久久久91精品| 成人一区在线看| 男人天堂av网站| 欧美色图片你懂的| 亚洲精品一级二级| 欧美在线视频网站| 在线欧美福利| 手机福利在线视频| 欧美激情综合在线| 国产一级在线观看| 中文亚洲视频在线| 欧美日韩国产免费观看视频| av网址在线观看免费| 色妞一区二区三区| 精品一区在线| 午夜精品短视频| 久久久五月婷婷| 欧美高清xxx| 欧美 日韩精品| 欧洲人成人精品| 欧美破处大片在线视频| 最新视频 - x88av| 国产精品毛片a∨一区二区三区| 欧美在线在线| 99视频免费| 亚洲国产精品系列| 欧美影院天天5g天天爽| 欧美日韩一区在线播放| 久久久三级国产网站| 粉嫩一区二区三区| 日本韩国欧美在线观看| 久久亚洲国产精品| 亚洲日本久久| www.亚洲天堂网| 久久露脸国产精品| 久久成人亚洲| 国产高清视频网站| 亚洲国产成人精品女人久久久| 波多野结衣一区二区三区免费视频| 日韩欧美在线免费观看视频| 制服丝袜亚洲网站| 天堂久久av| 97在线观视频免费观看| 成人高清视频观看www| 欧美一区二区在线视频| 国产成人精品免费视| 免费观看中文字幕| 这里精品视频免费| 亚洲日本青草视频在线怡红院| 久久r热视频| 亚洲性生活网站| 亚洲国产精品网站| 国产亚洲自拍一区| 欧美成人激情| 色七七在线观看| 国产精品一区久久久| 国产性做久久久久久| 国产一区二区观看| gogogogo高清视频在线| 青青青国产在线观看| 国产成人a亚洲精品| 国产亚洲精品精华液| 凹凸成人精品亚洲精品密奴| 999精品网站| 国产精品视频色| 欧美成人三级在线| 亚洲国产精品ⅴa在线观看| 欧美日韩女优| 日韩欧美亚洲在线| 欧美成人激情在线| 理论片日本一区| 91蝌蚪精品视频| 国产对白叫床清晰在线播放| 欧美一级免费视频| 欧美亚洲高清一区二区三区不卡| 国产99久久| 黄色网在线免费看| 国产伦精品一区二区三区照片| 精品亚洲国产成av人片传媒| 国产精品久久久久7777按摩| 亚洲日本欧美| 丁香五月缴情综合网| 欧美成人三区| 精品一卡二卡三卡四卡日本乱码 | 色噜噜狠狠成人网p站| 亚洲v天堂v手机在线| 性国产高清在线观看| 日日干夜夜操s8| 亚洲午夜精品久久| 亚洲精品视频免费在线观看| 亚洲免费观看在线视频| 亚洲春色h网| 日本黄色免费在线| 精品国产一区二区三区在线| 亚洲国产精品嫩草影院久久| 亚洲乱码国产乱码精品精98午夜| 久久成人免费电影| 欧美高清一区| 麻豆视频在线播放| 成人片在线播放| 欧美一区二区激情| 日韩综合中文字幕| 91美女在线视频| 自拍偷拍欧美日韩| 男女爽爽爽视频| 日韩女优中文字幕| 亚洲v日韩v综合v精品v| 欧美最猛黑人xxxxx猛交| 国产欧美久久久精品影院| 青青草97国产精品免费观看 | 99热在线观看| 黄色国产一级视频| 亚洲巨乳在线观看| 自拍亚洲一区欧美另类| 在线播放91灌醉迷j高跟美女| 一区二区三区欧美日| www欧美成人18+| 国产精品自在在线| 亚洲网一区二区三区| 成人在线电影网| 97中文字幕在线| 伊人精品久久久久7777| 成人在线观看av| 巨胸喷奶水www久久久免费动漫| 欧美肥婆姓交大片| 亚洲欧美日韩在线| 久久久久久久久久电影|