亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用iBatis數據映射框架吧

系統 2071 0
如果您厭煩了編寫 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 框架或者包裝。這可能發生在以下情況中,例如:

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

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

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

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

 好消息        

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

 iBatis 是什么?        

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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲欧美国产精品 | 国产日韩精品一区二区 | 丁香久久 | 国产91福利在线精品剧情尤物 | 亚洲国产精品综合一区在线 | 国产欧美一区二区三区沐欲 | 成人免费毛片观看 | 神马我我不卡伦影视 | 久久99热精品免费观看k影院 | 久久久网 | 天天鲁天天爱天天鲁天天 | 一级特黄aaaaaa大片 | 99re热精品视频国产免费 | 成年女人看片免费视频频 | 亚洲成人免费在线观看 | 国偷盗摄自产福利一区在线 | 亚洲国产精品视频在线观看 | 国产精品亚洲精品观看不卡 | 亚洲va久久久噜噜噜久久男同 | 99热久久国产这里是精品 | 亚洲欧美日韩精品久久久 | 免费看一级特黄a大片 | 日韩毛片免费观看 | 久久精品视频2 | 全免费午夜一级毛片一级毛 | 国产h版大片在线播放 | 日韩欧美一卡二区 | 色无极综合 | 日韩在线2020专区 | 国内精品伊人久久久影院 | 91色综合久久 | 中文字幕综合 | 私人影院在线 | 日韩国产欧美一区二区三区在线 | 噜噜嘿在线视频免费观看 | 国产a做爰全过程片 | 97在线看片免费福利视频 | 热热涩热热狠狠色香蕉综合 | 中文字幕亚洲综合久久 | 欧美亚洲日本在线 | 日韩精品一区二区三区中文在线 |