日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

使用iBatis數(shù)據(jù)映射框架吧

系統(tǒng) 2296 0
如果您厭煩了編寫 JDBC,可以考慮使用另一個功能豐富的數(shù)據(jù)映射框架 iBatis,它能夠實現(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-->

 引言        

對象關系映射程序(Object Relational Mappers,ORM)有多種形式。在 Java? 中,大多數(shù)流行的 ORM 都可以實現(xiàn)完整的域模型映射,它的目標是將整層的對象和行為映射到數(shù)據(jù)庫表。流行的 ORM 包括:

  • Hibernate

  • JDO

  • EJB Entities 3

  • EJB Entity Beans 2.x

  • TopLink

上 面每一個框架都被分類為一個完整的域模型映射程序,其中將表映射到對象,對象狀態(tài)得到維護,對象在任何時間或者某些時間跟隨一個連接的模型(由于客戶機組 件與對象交互,因此將涉及到基礎數(shù)據(jù)庫操作),并且抽象查詢語言通過對象模型進行工作。反過來,這些框架將生成 JDBC 或隱藏的 SQL 代碼。

然而,在某些情況下,您可能決定改為直接使用 JDBC。原因可能是:

  • 開發(fā)人員對 SQL 的了解以及使用 SQL 是否得心應手。        對象查詢語言仍不能免除必須了解 SQL,這是因為通常需要了解如何調優(yōu)查詢語言。

  • 對象關系映射程序對于某些類型的應用程序是重量級的。        例如,必須連續(xù)執(zhí)行多個更新操作的批處理應用程序通常能夠更好地依次執(zhí)行 SQL 語句,而無需所有額外的對象交互。

  • 存儲過程是必需的或者已經(jīng)存在。        使用存儲過程有多種合理的理由。在某些場景中,它們可以減少網(wǎng)絡 IO 的數(shù)量,因為 SQL 語句可以在數(shù)據(jù)庫依次執(zhí)行。

  • 數(shù)據(jù)庫管理員具有權限。        許多開發(fā)組織對于 SQL 以及可以定義 SQL 的人員有嚴格的規(guī)定。有時,只有數(shù)據(jù)庫管理員有權創(chuàng)建 SQL 并對 SQL 的性能進行調優(yōu)。

  • 以前的環(huán)境。        例如,正在從已經(jīng)調優(yōu)并測試 SQL 查詢的平臺上遷移應用程序。

對 于上述情況,通常的解決方案可能是:使用 JDBC。在構建 JDBC 代碼時開發(fā)人員常常需要一些指導;差的 JDBC 代碼往往使得到處都是數(shù)據(jù)訪問代碼。為了實現(xiàn)其所需的功能,開發(fā)人員最終常常開發(fā)某種自定義 JDBC 框架或者包裝。這可能發(fā)生在以下情況中,例如:

  1. 應用程序正在運行于 J2EE? 平臺。        Java 對象仍需要作為數(shù)據(jù)傳輸對象從業(yè)務邏輯層傳遞到視圖層,因此需要一些代碼將結果集數(shù)據(jù)移到數(shù)據(jù)傳輸對象,然后從數(shù)據(jù)傳輸對象移到 SQL 更新、插入或者刪除。

  2. 應用程序仍需要抽象層。        只是因為某人使用了 JDBC,它不能免除必須正確地對代碼分層。

  3. 應用程序需要將 SQL 從 Java 代碼提取出來以進行調優(yōu)。      

  4. 冗余是不可避免的。        在編寫 JDBC 時,開發(fā)人員常常發(fā)現(xiàn)自己在一次又一次地編寫相同的普通代碼,如獲得連接、準備語句、循環(huán)結果集以及其他一些 JDBC 特定元素。

 好消息        

這里有一個對象關系映射程序,它是一塊隱藏的寶石。它沒有創(chuàng)建完整的域模型,其工作是將 Java 對象直接映射到 SQL 語句。這個框架稱為  iBatis,它的目標是實現(xiàn)百分之八十的 JDBC 規(guī)范代碼,否則您必須自己編寫這些代碼。此外,它還提供了一個簡單的映射和 API 層,使開發(fā)人員能夠快速地開發(fā)數(shù)據(jù)訪問代碼。

 iBatis 是什么?        

iBatis 是一個開源的對象關系映射程序,其工作是將對象映射到 SQL 語句。通過使用一個稱為 SQL 映射的簡單概念,實現(xiàn)將 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 將參數(shù)映射定義為語句的輸入,并且將結果映射定義為映射 SQL ResultSets。這些映射被分配到可以執(zhí)行的語句。應用程序可以與 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 語句決不是一件簡單的事情。iBatis 支持所有 JDBC 應用程序需要的大多數(shù)功能:

  • JDBC 事務界定,包括對委托給 JDBC 事務 API、EJB 容器中的容器托管事務或者 JTA 事務中的用戶事務對象的支持。

  • 覆蓋缺省數(shù)據(jù)類型映射和創(chuàng)建自定義類型映射程序的功能。

  • 到復雜對象圖的復雜連接的映射,包括多種 Java 集合類型。

  • 將數(shù)據(jù)加載到 HashMaps 的功能(在查詢時列名是未知的)。

  • 對象圖 lazy loading。

  • JDBC 批處理語句。

  • 映射到存儲過程。

  • 動態(tài)的 SQL 映射,其中 SQL 語句可以構造為基于 JavaBean 的狀態(tài)。

  • 緩存結果和委托給其他緩存機制(如 IBM WebSphere? Application Server 動態(tài)緩存)的功能。

  • 新增的 DAO 框架;iBatis 提供了在數(shù)據(jù)映射程序中可以選擇使用的 DAO 模式的完整實現(xiàn)。

雖然 iBatis 還支持許多其他功能,但是它不能與成熟完備的 ORM 相比,ORM 具有抽象的查詢語言,能夠將 OO 構造(如繼承)映射到復雜的表關系,或者具有完全托管的對象狀態(tài)。iBatis 只是使您能夠將數(shù)據(jù)直接從 SQL 移到簡單的斷開連接的對象。

本文旨在讓喜歡自己編寫 SQL 的開發(fā)人員知道 iBatis 是一個非常強大且功能豐富的 ORM。  下面提供了詳細的參考資料信息。

如果您確定不需要使用完備的 ORM 并且傾向使用 JDBC,則可以考慮改用 iBatis。您幾乎能夠獲得 JDBC 的全部好處(而無需編寫過多的代碼),并且還可以獲得分層的體系結構以及重用已經(jīng)調優(yōu)的 SQL 查詢的功能


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 怀安县| 江山市| 宁南县| 县级市| 张家口市| 丰顺县| 太原市| 巍山| 惠安县| 茶陵县| 兴文县| 蓬溪县| 漳浦县| 衡南县| 徐汇区| 渭源县| 嘉鱼县| 鹿邑县| 通榆县| 巩留县| 赤壁市| 鹤庆县| 镇赉县| 太仆寺旗| 依安县| 河源市| 泗阳县| 沈阳市| 岢岚县| 枣阳市| 梁平县| 华亭县| 象山县| 青海省| 铜梁县| 乾安县| 望都县| 留坝县| 内丘县| 黔江区| 丰城市|