Java 平臺(tái)已經(jīng)有標(biāo)準(zhǔn)的 API 以 JDBC API 的形式與數(shù)據(jù)庫系統(tǒng)一起工作。這些 API 非常擅長(zhǎng)使用數(shù)據(jù)庫,并提供了從 Java 語言方便地與數(shù)據(jù)庫交互所需的方法。想學(xué)習(xí)java更多技能,建議參加java培訓(xùn),課程實(shí)時(shí)更新,緊跟市場(chǎng)和企業(yè),讓你學(xué)到最新的java技能,提高市場(chǎng)競(jìng)爭(zhēng)力。
但是,問題在于 Java 是一種面向?qū)ο蟮恼Z言。 JDBC提供了數(shù)據(jù)庫交互的核心API,并不專注于將數(shù)據(jù)庫表的行列結(jié)構(gòu)轉(zhuǎn)化為實(shí)體類。因此,需要在 JDBC API 之上工作的 API 層。持久性 API 或 JPA 緩解了兩種架構(gòu)上不同的模型,目的是利用操作的流動(dòng)性。 API 有助于將數(shù)據(jù)庫關(guān)系表表示為 POJO,并且可以通過 Java 代碼以類似的方式處理。核心 JDBC API 在后臺(tái)工作以處理復(fù)雜的通信和數(shù)據(jù)庫連接,而 JPA 使處理能夠根據(jù) Java 語言的面向?qū)ο蟠a完成。然而,關(guān)系數(shù)據(jù)庫和Java之間的數(shù)據(jù)映射并不是一件容易的事。
Java 持久性支持
在典型的關(guān)系數(shù)據(jù)庫中,信息以行列結(jié)構(gòu)存儲(chǔ)。數(shù)據(jù)庫系統(tǒng)和 Java 應(yīng)用程序的對(duì)象模型之間的數(shù)據(jù)交換很困難,因?yàn)?Java 將單個(gè)實(shí)體指定為由一組屬性和應(yīng)用于它們的操作表示的類。因此,為了使兩種不同架構(gòu)之間的行為不匹配,Java 程序員必須編寫多行代碼。這些代碼行有助于將數(shù)據(jù)庫表的行和列數(shù)據(jù)轉(zhuǎn)換為 Java 對(duì)象。但是,這些代碼行經(jīng)常變得過于重復(fù),導(dǎo)致源代碼充滿了樣板代碼。這是不可取的,并且違反了基本的面向?qū)ο蟮目芍赜眯栽瓌t。盡管聰明的代碼可以減輕許多逆境,但這并不是一個(gè)簡(jiǎn)單的解決方案。在java培訓(xùn)中,有更加系統(tǒng)全面的課程,明確清晰的學(xué)習(xí)路線,學(xué)習(xí)起來既輕松,又高效。
第三方解決方案的出現(xiàn)為將數(shù)據(jù)庫數(shù)據(jù)映射到 Java 對(duì)象提供了喘息的機(jī)會(huì),但它們并不標(biāo)準(zhǔn)。每個(gè)供應(yīng)商的實(shí)現(xiàn)都大相徑庭。這一切都意味著這種情況需要 Java 平臺(tái)本身提供標(biāo)準(zhǔn)的持久性 API 庫。這導(dǎo)致了 Java Persistence API (JPA) 的引入,特別是在 Java 的面向?qū)ο箢I(lǐng)域模型和數(shù)據(jù)庫系統(tǒng)之間架起了一座橋梁。
專有解決方案
數(shù)據(jù)映射器
數(shù)據(jù)映射器基本上是 Martin Fowler 在其 2003 年的企業(yè)應(yīng)用程序架構(gòu)模式一書中提出的架構(gòu)模式。它提供了解決對(duì)象關(guān)系問題的部分方法。映射器有助于創(chuàng)建一種策略,該策略屬于普通 JDBC 和全功能對(duì)象關(guān)系映射解決方案之間的類別。在這里,應(yīng)用程序開發(fā)人員使用數(shù)據(jù)映射器方法創(chuàng)建原始 SQL 字符串以將數(shù)據(jù)庫表映射到 Java 對(duì)象。有一個(gè)流行的框架使用這種 SQL 數(shù)據(jù)庫和 Java 對(duì)象之間的映射技術(shù),稱為 Apache iBatis。 Apache iBatis 項(xiàng)目現(xiàn)在已被宣布為非活動(dòng)狀態(tài)。但是,Apache iBatis 的原始創(chuàng)建者已將該項(xiàng)目轉(zhuǎn)移到 MyBatis 并正在積極開發(fā)中。
與使用 MyBatis 等數(shù)據(jù)映射器框架的其他對(duì)象關(guān)系問題解決方案不同,我們可以完全控制與數(shù)據(jù)庫的 SQL 事務(wù)。它是一個(gè)輕量級(jí)的解決方案,不承擔(dān)成熟 ORM 框架的開銷。但是,數(shù)據(jù)映射器存在問題。對(duì)對(duì)象模型所做的任何更改都會(huì)對(duì)數(shù)據(jù)模型產(chǎn)生影響。因此,必須直接對(duì) SQL 語句進(jìn)行重大更改。該框架的簡(jiǎn)約特性可幫助開發(fā)人員根據(jù)需要合并新的更改和修改。數(shù)據(jù)映射器在我們需要最小框架、顯式 SQL 處理以及對(duì)開發(fā)人員修改進(jìn)行更多控制的情況下特別有用。對(duì)java感興趣的同學(xué),可以考慮參加java培訓(xùn)學(xué)習(xí),課程會(huì)更系統(tǒng)全面一點(diǎn),能學(xué)到有用的的知識(shí),讓你少走彎路。
JDBC
JDBC(Java 數(shù)據(jù)庫連接)是 Microsoft 的 ODBC(對(duì)象數(shù)據(jù)庫連接)規(guī)范的 Java 特定版本。 ODBC 是用于連接來自任何語言或平臺(tái)的任何關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)。 JDBC 提供了與 Java 語言類似的抽象。 JDBC 使用 SQL 與數(shù)據(jù)庫進(jìn)行交互。開發(fā)人員必須根據(jù)后端數(shù)據(jù)庫的語法規(guī)范編寫 DDL 或 DML 查詢,但使用 Java 編程模型處理它們。 Java 源代碼和 SQL 語句之間存在緊密耦合。我們可以使用原始 SQL 語句并根據(jù)需要靜態(tài)地操作它們。由于其靜態(tài)性質(zhì),很難合并更改。此外,SQL 方言因數(shù)據(jù)庫供應(yīng)商而異。 JDBC 硬連線到數(shù)據(jù)庫而不是 Java 語言的對(duì)象模型。因此,使用它很快就會(huì)覺得很麻煩,尤其是當(dāng)來自 Java 源代碼的數(shù)據(jù)庫交互增加時(shí)。但是,JDBC 是 Java 中對(duì)數(shù)據(jù)庫持久性的主要支持,并構(gòu)成了高級(jí)框架的基礎(chǔ)。
EJB
帶有 J2EE 的 Enterprise Java Bean (EJB) 以實(shí)體 bean 的形式在 Java 持久性領(lǐng)域帶來了一些新變化。 這個(gè)想法是將開發(fā)人員與直接干預(yù)數(shù)據(jù)庫持久性的復(fù)雜性隔離開來。 它引入了一種基于接口的方法。 有一個(gè)專門的 bean 編譯器來生成持久性、事務(wù)管理和業(yè)務(wù)邏輯委托的實(shí)現(xiàn)。 專門的 XML 部署描述符用于配置實(shí)體 bean。 問題在于 EJB 并沒有簡(jiǎn)化事情,而是包含了很多復(fù)雜性。 結(jié)果,盡管隨后進(jìn)行了許多改進(jìn),例如引入了 Enterprise JavaBeans 查詢語言 (EJB QL),但它很快就失去了人氣。通過java培訓(xùn)學(xué)習(xí),有專業(yè)導(dǎo)師帶你學(xué)習(xí)系統(tǒng)全面的課程,還有實(shí)操項(xiàng)目的訓(xùn)練,真正將理論知識(shí)應(yīng)用到實(shí)踐中去,獲得項(xiàng)目實(shí)踐經(jīng)驗(yàn)。