欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統(tǒng) 2137 0
如果您厭煩了編寫 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ā)生在以下情況中,例如:

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

  2. 應(yīng)用程序仍需要抽象層。        只是因?yàn)槟橙耸褂昧?JDBC,它不能免除必須正確地對(duì)代碼分層。

  3. 應(yīng)用程序需要將 SQL 從 Java 代碼提取出來以進(jìn)行調(diào)優(yōu)。      

  4. 冗余是不可避免的。        在編寫 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 是什么?        

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ì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 97理论三级九七午夜在线观看 | 91影片 | 国产大伊香蕉精品视频 | 一本大道香蕉中文日本不卡高清二区 | 国产精品视频在线观看 | 国产成人视屏 | 亚洲精品一区二区三区福利 | aaaaaaa片毛片免费观看 | 久久一区二区精品综合 | 欧美黄色第一页 | 天天精品视频免费观看 | 久久99国产综合精品 | 亚洲三区在线观看 | 日本加勒比视频在线观看 | 中文在线国产 | 中国美女一级黄色片 | 人人狠狠综合88综合久久 | 性夜影院爽黄a爽在线看香蕉 | 亚洲国产在| 欧美黄一片 | 国产精品天天天天影视 | 夜夜骚| 久草色香蕉| 人人爽视频 | 久久久久国产一区二区三区 | 二区国产 | 69性影院在线观看国产精品87 | 国产日韩欧美在线 | 精品欧美日韩 | 亚洲欧美日韩一级特黄在线 | 一级做a爰片久久毛片 | 免费在线黄色电影 | 日本高清在线看片免费视频 | 日本视频在线免费 | 欧美国产激情二区三区 | 91网站免费观看直播 | 国产一区二区三区在线 | 激情一区 | 魔法骑士在线观看免费完整版 | 一本色道久久综合狠狠躁 | 一区二区三区亚洲 |