最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Java程序中使用數據庫的新方法

 更新時間:2015年07月10日 11:07:11   投稿:goldensun  
這篇文章主要介紹了在Java程序中使用數據庫的新方法,講述了Java8以來數據庫API的一些新特性,需要的朋友可以參考下

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

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


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

Collection<Customer> customers;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

customers
  .where( c -> c.getCountry().equals("Belgium") )
  .where( c -> {
    if (c.getSalary() < 100000)
      return c.getSalary() < c.getDebt();
    else
      return c.getSalary() < 2 * c.getDebt();
    } );

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

內部運作

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

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

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

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

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

SELECT *
 FROM Customers C

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

  d = c.getCountry()

  e = &#8220;Belgium&#8221;

  e = d.equals(e)

  return e

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

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

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

象征性執(zhí)行的例子

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

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

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

生成數據庫查詢


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

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

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

相關文章

  • Java實現單線程聊天室

    Java實現單線程聊天室

    這篇文章主要為大家詳細介紹了Java實現單線程聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • SpringMVC路徑匹配中使用通配符問題

    SpringMVC路徑匹配中使用通配符問題

    這篇文章主要介紹了SpringMVC路徑匹配中使用通配符問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java基礎之數組超詳細知識總結

    Java基礎之數組超詳細知識總結

    這篇文章主要介紹了Java基礎之數組詳解,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • 老生常談Java動態(tài)編譯(必看篇)

    老生常談Java動態(tài)編譯(必看篇)

    下面小編就為大家?guī)硪黄仙U凧ava動態(tài)編譯(必看篇)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Spring MVC深入學習之啟動初始化過程

    Spring MVC深入學習之啟動初始化過程

    最近因為工作的原因在學習Spring MVC,為了更深入的學習Spring MVC,下面這篇文章主要給大家介紹了關于Spring MVC深入學習之啟動初始化過程的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • SpringBoot項目的測試類實例解析

    SpringBoot項目的測試類實例解析

    這篇文章主要介紹了SpringBoot項目的測試類實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • spring boot基于DRUID實現數據源監(jiān)控過程解析

    spring boot基于DRUID實現數據源監(jiān)控過程解析

    這篇文章主要介紹了spring boot基于DRUID實現數據源監(jiān)控過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java 注解學習筆記

    Java 注解學習筆記

    這篇文章主要介紹了Java 注解的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 深入理解JVM垃圾回收算法

    深入理解JVM垃圾回收算法

    我們都知道java語言與C語言最大的區(qū)別就是內存自動回收,那么JVM是怎么控制內存回收的,這篇文章將介紹JVM垃圾回收的幾種算法,從而了解內存回收的基本原理
    2021-06-06
  • restTemplate發(fā)送get與post請求并且?guī)祮栴}

    restTemplate發(fā)送get與post請求并且?guī)祮栴}

    這篇文章主要介紹了restTemplate發(fā)送get與post請求并且?guī)祮栴},具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論

琼海市| 元阳县| 江陵县| 烟台市| 宁城县| 上犹县| 揭西县| 泸水县| 会同县| 错那县| 竹北市| 连江县| 逊克县| 城市| 大化| 内江市| 武穴市| 介休市| 鞍山市| 和顺县| 永城市| 禄丰县| 汶上县| 肃宁县| 岚皋县| 西乡县| 习水县| 区。| 文水县| 科技| 马鞍山市| 乌拉特中旗| 炉霍县| 铅山县| 拜泉县| SHOW| 颍上县| 城市| 毕节市| 绥化市| 永兴县|