如果您厭煩了編寫 JDBC,可以考慮使用另一個功能豐富的數據映射框架 iBatis,它能夠實現大多數同樣的好處,并且只需要編寫非常少的代碼。
<!--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-->
對象關系映射程序(Object Relational Mappers,ORM)有多種形式。在 Java? 中,大多數流行的 ORM 都可以實現完整的域模型映射,它的目標是將整層的對象和行為映射到數據庫表。流行的 ORM 包括:
Hibernate
JDO
EJB Entities 3
EJB Entity Beans 2.x
TopLink
上 面每一個框架都被分類為一個完整的域模型映射程序,其中將表映射到對象,對象狀態得到維護,對象在任何時間或者某些時間跟隨一個連接的模型(由于客戶機組 件與對象交互,因此將涉及到基礎數據庫操作),并且抽象查詢語言通過對象模型進行工作。反過來,這些框架將生成 JDBC 或隱藏的 SQL 代碼。
然而,在某些情況下,您可能決定改為直接使用 JDBC。原因可能是:
開發人員對 SQL 的了解以及使用 SQL 是否得心應手。 對象查詢語言仍不能免除必須了解 SQL,這是因為通常需要了解如何調優查詢語言。
對象關系映射程序對于某些類型的應用程序是重量級的。 例如,必須連續執行多個更新操作的批處理應用程序通常能夠更好地依次執行 SQL 語句,而無需所有額外的對象交互。
存儲過程是必需的或者已經存在。 使用存儲過程有多種合理的理由。在某些場景中,它們可以減少網絡 IO 的數量,因為 SQL 語句可以在數據庫依次執行。
數據庫管理員具有權限。 許多開發組織對于 SQL 以及可以定義 SQL 的人員有嚴格的規定。有時,只有數據庫管理員有權創建 SQL 并對 SQL 的性能進行調優。
以前的環境。 例如,正在從已經調優并測試 SQL 查詢的平臺上遷移應用程序。
對 于上述情況,通常的解決方案可能是:使用 JDBC。在構建 JDBC 代碼時開發人員常常需要一些指導;差的 JDBC 代碼往往使得到處都是數據訪問代碼。為了實現其所需的功能,開發人員最終常常開發某種自定義 JDBC 框架或者包裝。這可能發生在以下情況中,例如:
應用程序正在運行于 J2EE? 平臺。 Java 對象仍需要作為數據傳輸對象從業務邏輯層傳遞到視圖層,因此需要一些代碼將結果集數據移到數據傳輸對象,然后從數據傳輸對象移到 SQL 更新、插入或者刪除。
應用程序仍需要抽象層。 只是因為某人使用了 JDBC,它不能免除必須正確地對代碼分層。
應用程序需要將 SQL 從 Java 代碼提取出來以進行調優。
冗余是不可避免的。 在編寫 JDBC 時,開發人員常常發現自己在一次又一次地編寫相同的普通代碼,如獲得連接、準備語句、循環結果集以及其他一些 JDBC 特定元素。
這里有一個對象關系映射程序,它是一塊隱藏的寶石。它沒有創建完整的域模型,其工作是將 Java 對象直接映射到 SQL 語句。這個框架稱為 iBatis,它的目標是實現百分之八十的 JDBC 規范代碼,否則您必須自己編寫這些代碼。此外,它還提供了一個簡單的映射和 API 層,使開發人員能夠快速地開發數據訪問代碼。
iBatis 是一個開源的對象關系映射程序,其工作是將對象映射到 SQL 語句。通過使用一個稱為 SQL 映射的簡單概念,實現將 Java 對象(如下所示)映射到 SQL 語句:
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 的文件內定義該映射。示例如下:
<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 將參數映射定義為語句的輸入,并且將結果映射定義為映射 SQL ResultSets。這些映射被分配到可以執行的語句。應用程序可以與 iBatis API 交互以執行 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); |
如您所見,執行 SQL 語句決不是一件簡單的事情。iBatis 支持所有 JDBC 應用程序需要的大多數功能:
JDBC 事務界定,包括對委托給 JDBC 事務 API、EJB 容器中的容器托管事務或者 JTA 事務中的用戶事務對象的支持。
覆蓋缺省數據類型映射和創建自定義類型映射程序的功能。
到復雜對象圖的復雜連接的映射,包括多種 Java 集合類型。
將數據加載到 HashMaps 的功能(在查詢時列名是未知的)。
對象圖 lazy loading。
JDBC 批處理語句。
映射到存儲過程。
動態的 SQL 映射,其中 SQL 語句可以構造為基于 JavaBean 的狀態。
緩存結果和委托給其他緩存機制(如 IBM WebSphere? Application Server 動態緩存)的功能。
新增的 DAO 框架;iBatis 提供了在數據映射程序中可以選擇使用的 DAO 模式的完整實現。
雖然 iBatis 還支持許多其他功能,但是它不能與成熟完備的 ORM 相比,ORM 具有抽象的查詢語言,能夠將 OO 構造(如繼承)映射到復雜的表關系,或者具有完全托管的對象狀態。iBatis 只是使您能夠將數據直接從 SQL 移到簡單的斷開連接的對象。
本文旨在讓喜歡自己編寫 SQL 的開發人員知道 iBatis 是一個非常強大且功能豐富的 ORM。 下面提供了詳細的參考資料信息。
如果您確定不需要使用完備的 ORM 并且傾向使用 JDBC,則可以考慮改用 iBatis。您幾乎能夠獲得 JDBC 的全部好處(而無需編寫過多的代碼),并且還可以獲得分層的體系結構以及重用已經調優的 SQL 查詢的功能
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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