如果您厭煩了編寫 JDBC,可以考慮使用另一個(gè)功能豐富的數(shù)據(jù)映射框架 iBatis,它能夠?qū)崿F(xiàn)大多數(shù)同樣的好處,并且只需要編寫非常少的代碼。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
對(duì)象關(guān)系映射程序(Object Relational Mappers,ORM)有多種形式。在 Java? 中,大多數(shù)流行的 ORM 都可以實(shí)現(xiàn)完整的域模型映射,它的目標(biāo)是將整層的對(duì)象和行為映射到數(shù)據(jù)庫(kù)表。流行的 ORM 包括:
Hibernate
JDO
EJB Entities 3
EJB Entity Beans 2.x
TopLink
上 面每一個(gè)框架都被分類為一個(gè)完整的域模型映射程序,其中將表映射到對(duì)象,對(duì)象狀態(tài)得到維護(hù),對(duì)象在任何時(shí)間或者某些時(shí)間跟隨一個(gè)連接的模型(由于客戶機(jī)組 件與對(duì)象交互,因此將涉及到基礎(chǔ)數(shù)據(jù)庫(kù)操作),并且抽象查詢語(yǔ)言通過對(duì)象模型進(jìn)行工作。反過來,這些框架將生成 JDBC 或隱藏的 SQL 代碼。
然而,在某些情況下,您可能決定改為直接使用 JDBC。原因可能是:
開發(fā)人員對(duì) SQL 的了解以及使用 SQL 是否得心應(yīng)手。 對(duì)象查詢語(yǔ)言仍不能免除必須了解 SQL,這是因?yàn)橥ǔP枰私馊绾握{(diào)優(yōu)查詢語(yǔ)言。
對(duì)象關(guān)系映射程序?qū)τ谀承╊愋偷膽?yīng)用程序是重量級(jí)的。 例如,必須連續(xù)執(zhí)行多個(gè)更新操作的批處理應(yīng)用程序通常能夠更好地依次執(zhí)行 SQL 語(yǔ)句,而無需所有額外的對(duì)象交互。
存儲(chǔ)過程是必需的或者已經(jīng)存在。 使用存儲(chǔ)過程有多種合理的理由。在某些場(chǎng)景中,它們可以減少網(wǎng)絡(luò) IO 的數(shù)量,因?yàn)?SQL 語(yǔ)句可以在數(shù)據(jù)庫(kù)依次執(zhí)行。
數(shù)據(jù)庫(kù)管理員具有權(quán)限。 許多開發(fā)組織對(duì)于 SQL 以及可以定義 SQL 的人員有嚴(yán)格的規(guī)定。有時(shí),只有數(shù)據(jù)庫(kù)管理員有權(quán)創(chuàng)建 SQL 并對(duì) SQL 的性能進(jìn)行調(diào)優(yōu)。
以前的環(huán)境。 例如,正在從已經(jīng)調(diào)優(yōu)并測(cè)試 SQL 查詢的平臺(tái)上遷移應(yīng)用程序。
對(duì) 于上述情況,通常的解決方案可能是:使用 JDBC。在構(gòu)建 JDBC 代碼時(shí)開發(fā)人員常常需要一些指導(dǎo);差的 JDBC 代碼往往使得到處都是數(shù)據(jù)訪問代碼。為了實(shí)現(xiàn)其所需的功能,開發(fā)人員最終常常開發(fā)某種自定義 JDBC 框架或者包裝。這可能發(fā)生在以下情況中,例如:
應(yīng)用程序正在運(yùn)行于 J2EE? 平臺(tái)。 Java 對(duì)象仍需要作為數(shù)據(jù)傳輸對(duì)象從業(yè)務(wù)邏輯層傳遞到視圖層,因此需要一些代碼將結(jié)果集數(shù)據(jù)移到數(shù)據(jù)傳輸對(duì)象,然后從數(shù)據(jù)傳輸對(duì)象移到 SQL 更新、插入或者刪除。
應(yīng)用程序仍需要抽象層。 只是因?yàn)槟橙耸褂昧?JDBC,它不能免除必須正確地對(duì)代碼分層。
應(yīng)用程序需要將 SQL 從 Java 代碼提取出來以進(jìn)行調(diào)優(yōu)。
冗余是不可避免的。 在編寫 JDBC 時(shí),開發(fā)人員常常發(fā)現(xiàn)自己在一次又一次地編寫相同的普通代碼,如獲得連接、準(zhǔn)備語(yǔ)句、循環(huán)結(jié)果集以及其他一些 JDBC 特定元素。
這里有一個(gè)對(duì)象關(guān)系映射程序,它是一塊隱藏的寶石。它沒有創(chuàng)建完整的域模型,其工作是將 Java 對(duì)象直接映射到 SQL 語(yǔ)句。這個(gè)框架稱為 iBatis,它的目標(biāo)是實(shí)現(xiàn)百分之八十的 JDBC 規(guī)范代碼,否則您必須自己編寫這些代碼。此外,它還提供了一個(gè)簡(jiǎn)單的映射和 API 層,使開發(fā)人員能夠快速地開發(fā)數(shù)據(jù)訪問代碼。
iBatis 是一個(gè)開源的對(duì)象關(guān)系映射程序,其工作是將對(duì)象映射到 SQL 語(yǔ)句。通過使用一個(gè)稱為 SQL 映射的簡(jiǎn)單概念,實(shí)現(xiàn)將 Java 對(duì)象(如下所示)映射到 SQL 語(yǔ)句:
public class Customer implements Serializable { private String name; private int customerId; private CustomerOrder customerOrder; public Customer() { System.out.println("Creating CustomerBO..."); } /** * @return Returns the customerId. */ public int getCustomerId() { return customerId; } /** * @param customerId The customerId to set. */ public void setCustomerId(int customerId) { this.customerId = customerId; } /** * @return Returns the name. */ public String getName() { return name; } /** * @param name The name to set. */ public void setName(String name) { this.name = name; } /** * @return Returns the customerOrder. */ public CustomerOrder getCustomerOrder() { return customerOrder; } /** * @param customerOrder The customerOrder to set. */ public void setCustomerOrder(CustomerOrder customerOrder) { this.customerOrder = customerOrder; } } |
您需要在名為 SQLMap 的文件內(nèi)定義該映射。示例如下:
<sqlMap namespace="Customer"> <parameterMap id="" class="com.ibm.ibatis.sample.bo.CustomerOrder"> <parameter property="orderId" /> <parameter property="customerId" /> </parameterMap> <resultMap class="com.ibm.persistence.ibatis.bo.Customer" id=""> <result property="customerId" column="CUST_ID" nullValue="0" /> <result property="customerOrder.orderId" column="OPEN_ORDER_ID" nullValue="0" /> <result property="customerOrder.customerId" column="CUST_ID" nullValue="0" /> </resultMap> <statement id="checkCustomer" parameterClass="java.lang.Integer" "> SELECT CUST_ID, OPEN_ORDER_ID FROM CUSTOMER_USER.CUSTOMER WHERE CUST_ID = #customerId# FOR UPDATE </statement> <statement id="getOrderId" parameterClass="java.lang.Integer" resultClass="java.lang.Integer"> SELECT ORDER_ID FROM CUSTOMER_USER.ORDER WHERE CUSTOMER_ID = #customerId# AND STATUS='OPEN' </statement> <statement id="insertOrder" parameterClass="java.lang.Integer"> INSERT INTO CUSTOMER_USER.ORDER (STATUS, TOTAL, CUSTOMER_ID)VALUES('OPEN',0,#customerId#) </statement> <statement id="updateCustomerOrderId" parameterMap=""> UPDATE CUSTOMER_USER.CUSTOMER SET OPEN_ORDER_ID = ? WHERE CUST_ID = ? </statement> </sqlMap> |
iBatis 將參數(shù)映射定義為語(yǔ)句的輸入,并且將結(jié)果映射定義為映射 SQL ResultSets。這些映射被分配到可以執(zhí)行的語(yǔ)句。應(yīng)用程序可以與 iBatis API 交互以執(zhí)行 SQL 操作,如下所示:
//Access SQL client Maop SqlMapClient sqlMapClient = OrderEntryConfig.getSqlMapInstance(); //1. Retrieve total using SUM() function in SQL Integer total = (Integer)sqlMapClient.queryForObject(,new Integer (customerOrder.getOrderId())); //2. Set total in CustomerOrder Object customerOrder.setTotal(total); //3. Update Total column in DB sqlMapClient.update(,customerOrder); |
如您所見,執(zhí)行 SQL 語(yǔ)句決不是一件簡(jiǎn)單的事情。iBatis 支持所有 JDBC 應(yīng)用程序需要的大多數(shù)功能:
JDBC 事務(wù)界定,包括對(duì)委托給 JDBC 事務(wù) API、EJB 容器中的容器托管事務(wù)或者 JTA 事務(wù)中的用戶事務(wù)對(duì)象的支持。
覆蓋缺省數(shù)據(jù)類型映射和創(chuàng)建自定義類型映射程序的功能。
到復(fù)雜對(duì)象圖的復(fù)雜連接的映射,包括多種 Java 集合類型。
將數(shù)據(jù)加載到 HashMaps 的功能(在查詢時(shí)列名是未知的)。
對(duì)象圖 lazy loading。
JDBC 批處理語(yǔ)句。
映射到存儲(chǔ)過程。
動(dòng)態(tài)的 SQL 映射,其中 SQL 語(yǔ)句可以構(gòu)造為基于 JavaBean 的狀態(tài)。
緩存結(jié)果和委托給其他緩存機(jī)制(如 IBM WebSphere? Application Server 動(dòng)態(tài)緩存)的功能。
新增的 DAO 框架;iBatis 提供了在數(shù)據(jù)映射程序中可以選擇使用的 DAO 模式的完整實(shí)現(xiàn)。
雖然 iBatis 還支持許多其他功能,但是它不能與成熟完備的 ORM 相比,ORM 具有抽象的查詢語(yǔ)言,能夠?qū)?OO 構(gòu)造(如繼承)映射到復(fù)雜的表關(guān)系,或者具有完全托管的對(duì)象狀態(tài)。iBatis 只是使您能夠?qū)?shù)據(jù)直接從 SQL 移到簡(jiǎn)單的斷開連接的對(duì)象。
本文旨在讓喜歡自己編寫 SQL 的開發(fā)人員知道 iBatis 是一個(gè)非常強(qiáng)大且功能豐富的 ORM。 下面提供了詳細(xì)的參考資料信息。
如果您確定不需要使用完備的 ORM 并且傾向使用 JDBC,則可以考慮改用 iBatis。您幾乎能夠獲得 JDBC 的全部好處(而無需編寫過多的代碼),并且還可以獲得分層的體系結(jié)構(gòu)以及重用已經(jīng)調(diào)優(yōu)的 SQL 查詢的功能
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
