2010-03-07 58 views
58

這只是理論上的問題。Java - JDBC備選

我使用JDBC與我的Java應用程序使用數據庫(選擇,插入,更新,刪除或其他)。 我製作了「手動」的Java類,它將包含來自數據庫表(屬性= db列)的數據。然後我進行查詢(ResultSet)並用數據填充這些類。我不確定,如果這是正確的方法。

但我讀了很多關於JDO和其他持久性解決方案。

有人可以根據他們的經驗推薦最好的JDBC選擇嗎?

我也想知道JDO優於JDBC的優點(用簡單的話來說)。

我已經能夠谷歌這東西很多,但從「第一手」的意見總是最好的。

感謝

回答

121

數據庫持久性的Java中的故事已經很長,充滿了波折:

  • JDBC每個人都使用在結束談話到數據庫的底層API。但是,如果不使用更高級別的API,則必須自己完成所有煩人的工作(編寫SQL查詢,將結果映射到對象等)。

  • EJB 1.0 CMP實體bean是第一次嘗試了更高級別的API,並已成功地由大的Java EE提供商(BEA,IBM),但不被用戶採用。實體Bean太複雜,開銷太多(理解,性能差)。 失敗!

  • EJB 2.0 CMP試圖減少一些實體Bean引進的本地接口的複雜性,但大多數的複雜性依然存在。 EJB 2.0也缺乏可移植性(因爲對象關係映射不是規範的一部分,因此部署描述符是專有的)。 失敗!

  • 然後來到JDO其中爲對象持久的數據存儲不可知標準(可以與RDBMS,OODBMS,XML,Excel中,LDAP中使用)。但是,雖然有幾個開源實現,而JDO已被小型獨立供應商採用(大多數OODBMS供應商希望JDO用戶以後可以從其RDBMS數據存儲轉換爲OODBMS--但這顯然從未發生過),但它未能成爲被大型Java EE玩家和用戶所採用(因爲編織在開發時很痛苦,嚇倒了一些客戶,一個奇怪的查詢API,實際上太抽象了)。所以,雖然標準本身並沒有死亡,但我認爲它是一種失敗。 失敗!

  • 事實上,儘管兩個標準,專有的API存在類似的Toplink,一個老玩家,還是休眠已優先被用戶通過EJB CMP和JDO的對象關係型數據庫的持久性之間(競爭標準,JDO定位不清,CMP早期失敗以及不好的市場營銷等都是我的一部分責任),Hibernate實際上已經成爲這個領域的事實標準(這是一個很好的開源框架)。 SUCCESS!

  • 然後太陽意識到,他們必須把事情簡單化(更通常整個的Java EE),他們EE 5做了它在Java中與JPA,Java持久性API,它是EJB 3.0的一部分,是對象關係數據庫持久性的新標準。 JPA統一了EJB 2 CMP,JDO,Hibernate和TopLink API /產品,並且在EJB CMP和JDO失敗(易用性和採用)方面似乎取得成功。 SUCCESS!

總之,Java對數據庫持久標準是JPA,應(使用Hibernate實現JPA的是好的,但使用JPA API)超過其他專有的API是首選,除非ORM是不是你需要。它提供了比JDBC更高級別的API,旨在爲您節省大量手動工作(這是簡化的,但這就是想法)。

+1

輝煌,這是我exaclty想要的,幫助最讚賞! BTW:您知道NetBeans IDE使用byt默認設置嗎? F.E.當我將數據庫表拖放到JTable時,NetBeans生成一些具有管理功能的類...使用實體管理器,查詢結果等。 – Mike 2010-03-07 18:47:12

+1

@Mike謝謝。關於NetBeans,最近的版本默認支持JPA(如Sun的標準,這很合理)。實際上,'EntityManager'是JPA的一部分。 – 2010-03-07 19:08:56

+0

太棒了,我會嘗試JPA我想:) – Mike 2010-03-07 19:27:12

8

我可以推薦Hibernate。它被廣泛使用(並且有很好的理由),並且由Hibernate的主設計人員領導的規範保證了它將在可預見的未來中出現:-)如果可移植性和供應商中立性對您很重要,那麼您可以通過JPA使用它,所以將來您可以輕鬆切換到另一個JPA實現。

由於缺乏JDO的個人經驗,我無法真正比​​較兩者。然而,Hibernate(或者一般來說ORM)的好處看起來與JDO page上列出的幾乎相同。對我來說,最重要的兩點是:

  • DB中立:Hibernate支持多種SQL方言的背景下,DB之間的切換是改變一行在您的配置
  • 表現爲容易:被默認延遲抓取,還有很多優化正在進行,你需要用JDBC手動處理,你可以專注於你的領域模型和麪向對象的設計,而不是低級別的數據庫問題(但你當然可以微調DML和DDL如果你願意的話)

(一般的ORM工具的一個潛在缺點)是它不適合批處理。如果您需要更新表中的1百萬行,默認情況下,ORM不會像JDBC批處理更新或存儲過程那樣執行。 Hibernate可以整合存儲過程,並且它在一定程度上支持批處理(我對此尚不熟悉,所以我不能確定它是否與JDBC相比在這方面完成了任務 - 但是從我的判斷來看至今知道,可能是)。所以如果你的應用程序需要一些批處理,但主要是處理單個實體,Hibernate仍然可以工作。如果它主要做批處理,也許JDBC是更好的選擇。

+0

+1 - 你打敗了我。 Hibernate是一個很好的ORM,具有足夠的靈活性,可以讓你完成幾乎任何你要在JDBC中直接完成的任務。 – Elie 2010-03-07 17:05:22

+2

是的,我聽到很多有關休眠 你是否推薦它在小型項目中使用? 像50個班,10-15個DB表?還是堅持手動JDBC數據管理? – Mike 2010-03-07 17:08:58

+0

@Mike很好的問題。有人說這對於小型項目來說太過分了。我使用Cayenne(http://cayenne.apache.org)做了一個更小的項目,它是一個類似的ORM工具,我很滿意。所以我肯定會試一試。它可能感覺你需要在啓動時做很多「額外」工作,但恕我直言,它將在長期運行中收回。 – 2010-03-07 17:13:53

6

JDO構建了JDBC技術。同樣,Hibernate也需要JDBC。 JDBC是Java在數據庫連接上的基本規範。

這意味着JDBC會給你更大的控制權,但它需要更多的管道代碼。

JDO提供更高的抽象和更少的管道代碼,因爲隱藏了很多複雜性。

如果你問這個問題,我猜你對JDBC不熟悉。爲了有效地使用JDO,Hibernate或任何其他更高級的抽象工具,我認爲需要對JDBC有一個基本的瞭解。否則,您可能會遇到ORM工具顯示您可能無法理解的行爲的情況。

Sun的Java教程在他們的網站上提供了一個體面的介紹性材料,可以引導您學習JDBC。 http://java.sun.com/docs/books/tutorial/jdbc/

+1

謝謝,我會牢記 – Mike 2010-03-07 17:09:48

1

Hibernate,當然。它很受歡迎,甚至有一個.NET版本。另外,hibernate可以很容易地與Spring框架集成在一起。

而且,它將主要適合任何開發人員的需求。

1

一個令人興奮的新選擇是GORM,這是Grails的ORM實現。現在可以單獨使用。 它引擎蓋下使用休眠,但給你一個很好的層與頂級酷動態發現等。

+1

「底層使用Hibernate」 - 和Spring。 – duffymo 2010-03-07 17:21:38

7

Hibernate要求您有一個對象模型來映射您的架構。如果你仍然只考慮關係模式和SQL,Hibernate可能不適合你。

您必須願意接受Hibernate將爲您生成的SQL。如果你認爲用手編SQL可以做得更好,或許Hibernate不適合你。

另一種選擇是iBatis。如果JDBC是原始SQL,而Hibernate是ORM,那麼iBatis可以被認爲是兩者之間的東西。它使您可以更好地控制執行的SQL。

+0

+1 ** ** iBatis **。通常被忽略,但對使用DBMS的專有功能的只讀複雜查詢很有用。 – 2010-06-21 03:05:21

+0

太好了 - 爲什麼不直接寫SQL並省去膨脹? – duffymo 2016-01-21 10:15:25

1

所有這些不同的抽象層最終都使用JDBC。整個想法是自動化一些單調乏味和容易出錯的工作,就像編譯器自動化編寫程序(調整數據結構大小 - 沒有問題,只是重新編譯)中的許多繁瑣工作一樣。

但是,請注意,爲了使這些工作有一些假設,你需要堅持。這些通常是合理的,並且很容易處理,特別是如果您從Java端開始,而不是必須使用現有的數據庫表。

JDO是單個Sun標準中各種項目的融合,也是我建議您學習的項目。爲了實現,請選擇您最喜歡的IDE在其各種嚮導中建議的那個。

0

我推薦使用Hibernate,它的連接數據庫的方式非常奇妙,之前幾乎沒有問題,但後來它更穩定。 它使用基於ORM的映射,它減少了將查詢寫入某個範圍的時間,並且它允許以最小的努力更改數據庫。 如果您需要任何基於視頻的教程,請告訴我,我可以在我的服務器中上傳並向您發送鏈接。

12

如果您想自己編寫SQL,並且不想使用ORM,那麼仍然可以從隱藏所有繁瑣連接處理(try-catch-finally)的某些框架中受益。最終你會忘記關閉連接...

一個很容易使用的框架是Spring JdbcTemplate

1

還有扭矩(http://db.apache.org/torque/),我個人比較喜歡,因爲它更簡單,並且完全符合我的需求。

隨着扭矩我可以用mysql定義數據庫(我使用Postgresql,但也支持Mysql),然後Torque可以查詢數據庫,然後爲數據庫中的每個表生成Java類。使用Torque,您可以查詢數據庫並獲取正確類型的Java對象。

它支持where子句(既可以使用Criteria對象,也可以自己編寫sql)和連接。

它也支持外鍵,所以如果你有一個用戶表和一個房子表,用戶可以擁有0個或更多房屋,那麼在用戶對象上會有一個getHouses()方法,它會給你列表House對象是用戶自己的。

要了解您可以編寫的代碼類型,請參閱http://db.apache.org/torque/releases/torque-3.3/tutorial/step5.html,其中包含的示例顯示如何使用轉矩加載/保存/查詢數據。 (本例中使用的所有類都是基於數據庫定義自動生成的)。

1

Ebean ORM是另一替代http://ebean-orm.github.io/

Ebean使用JPA註解爲映射,但它的架構是無會話。這意味着你沒有附加/分離的概念,你不需要保存/合併/刷新 - 你只需簡單地保存()你的bean。

  • 我預計Ebean是多少simplier使用比的Hibernate,JPA或JDO

所以,如果你正在尋找一個強大的替代方法,JDO或JPA,你可以看看Ebean 。

3

看看MyBatis。通常被忽略,但對使用DBMS的專有功能的只讀複雜查詢很有用。

http://www.mybatis.org

1

這裏是如何去與Java持久性。你剛剛學過java,現在你想堅持一些記錄,你就可以學習JDBC。您很高興現在可以將數據保存到數據庫中。然後你決定寫一個更大的應用程序。您意識到,嘗試,捕獲,打開連接,關閉連接,將結果集中的數據傳輸到您的bean已變得乏味......所以您認爲必須有一種更簡單的方法。在Java中總是有另一種選擇。所以你做了一些Google搜索,並在短時間內發現ORM,並且很可能是休眠。你很激動,你現在不必考慮連接。您的表格正在自動創建。你可以快速移動。然後你決定進行一個非常大的項目,一開始你的行動非常迅速,並且你已經完成了所有的粗暴行動。這些要求不斷提出,然後有一天你被迫走了。您嘗試保存,但不與對象兒童級聯。有些事情按照你讀過的書中的解釋工作。你不知道該怎麼做,因爲你沒有寫hibernate庫。你希望你自己寫了SQL。現在是時候重新思考了......隨着你的成熟,你意識到與數據庫交互的最佳方式是通過SQL。你也意識到有些工具可以讓你的開始速度非常快,但他們無法讓你持續很久。這是我的故事。我現在是一個非常快樂的ibatis /用戶。

0

下面是它如何與java持久性。你剛剛學過java,現在你想堅持一些記錄,你就可以學習JDBC。您很高興現在可以將數據保存到數據庫中。然後你決定寫一個更大的應用程序。您意識到,嘗試,捕獲,打開連接,關閉連接,將結果集中的數據傳輸到您的bean已變得乏味......所以您認爲必須有一種更簡單的方法。在Java中總是有另一種選擇。所以你做了一些Google搜索,並在短時間內發現ORM,並且很可能是休眠。你很激動,你現在不必考慮連接。您的表格正在自動創建。你可以快速移動。然後你決定進行一個非常大的項目,一開始你的行動非常迅速,並且你已經完成了所有的粗暴行動。

2

JPA/Hibernate是ORM的熱門選擇。它可以爲您提供幾乎所有您需要的ORM功能。對於那些具有基本ORM需求的人來說,學習曲線可能非常陡峭。

對於具有基本ORM要求的開發人員來說,JPA有很多替代方法可以爲ORM提供更低的複雜度。例如查詢sourceforge上: http://sourceforge.net/directory/language:java/?q=ORM

我偏我的解決方案,Sormula:sourceforgebitbucket。 Sormula旨在最大限度地減少複雜性,同時提供基本的ORM。

-1

使用hibernate作爲獨立的JAR文件,然後將其分發到您的不同web應用程序。這是迄今爲止最好的解決方案。你必須設計你的類,接口,枚舉來完成一個抽象的DAO模式。只要你有正確的實體和映射。您只需要使用對象(實體)而不是HSQL。

+0

沒有事實可以證明這是「最好的解決方案」 – Woot4Moo 2012-10-21 15:08:34

+0

@ Woot4Moo - 關於這個問題的一切都挺有趣的。您應該重點關注主觀的「什麼是最好的/推薦我」的問題,而不是關閉。 – Kev 2012-10-21 22:09:10