熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

使用SQLMaps 進行對象關系映射

2013-11-23 19:48:24  來源: Java高級技術 

  引論
  
  隨著Hibernate逐漸成為其他架構之首現今的許多工作都是在對象關系(OR)映射域上進行但是那些對象關系映射工具有一個問題大部分數據庫管理員似乎對這些對象關系(OR)映射工具所產生的查詢不放心不幸的是這些數據庫管理員不了解架構所產生的查詢是多麼的優越並且使你的應用程序更加靈活他們覺得隨著數據庫成為應用程序的主要瓶頸應該完全控制SQL查詢以便他們能分析和調試以促進性能
  
  但有個問題是如果不使用對象關系(OR)映射工具那麼你將花費很多資源在書面形式上和維護低級JDBC代碼由於以下原因每個JDBC應用程序都將含有重復代碼
  
  連接和事務管理
  
  設置java對象為查詢參數
  
  轉換SQL ResultSets 為 java 對象
  
  生成查詢字符串
  
  iBatis 的 SQLMaps 架構幫助我們在相當大的程度上減少了正常情況下訪問關系數據庫的java代碼的總量它考慮到了當前三個比較關心的問題所以它可以將一個簡單的 JavaBean 對象映射到 PreparedStatement 參數和 ResultSet 值SQLMaps 的原理其實很簡單提供一個簡單的架構來提供%的JDBC功能
  
  這篇文章是關於如何使用 SQLMaps 架構的進階輔導我們將建立一個簡單的 Struts 應用程序並且用 SQLMaps 配置它為開始接著我們將演示如何執行基本的數據庫操作比如 SELECT INSERT UPDATE 等等然後我們將演示 SQLMaps 為連接和事務管理提供的操作在最後我們將試著使用一些高級的 SQLMaps 功能部件比如緩存和分頁
  
  SQLMaps 的基本思想
  
  使用 SQLMaps 架構你必須建立一個XML文件列出所有你希望在應用程序中執行的SQL查詢對於每個SQL查詢你來指定哪個java類可以交換參數和ResultSet(結果集)
  
  在你的java代碼中如果你想要執行一個特殊的查詢你需要創建一個對象來傳遞查詢參數和必要的條件然後傳遞這個對象和查詢的名字讓 SQLMaps 執行一旦查詢被執行SQLMaps 將為你指定的接受查詢結果的類創建一個句柄並且將它和數據庫返回的ResultSet 中的值存儲在一起
  
  一個簡單的使用SQLMaps的應用程序(Hello World)
  
  我們將創建一個簡單的Struts應用程序開始來演示什麼是使用SQLMaps的應用程序所需要的這個例子的代碼是來自以下資源部分在這個例子中我們用一個Jsp頁面要求用戶輸入contactId屬性一旦它被提交我們用它在CONTACT 表中搜索一個連接並且用另一個Jsp頁面展示給用戶接下來一步一步說明
  
   拷貝ibatissqlmapjar 和 ibatiscommonjar 到你的 webinf/lib 文件夾中
  
   在你的java源文件夾中創建一個 SqlMapConfigxml 文件像這樣
  
  <sqlMapConfig>  <settings useStatementNamespaces=false />  <transactionManager type=JDBC>    <dataSource type=SIMPLE >      <property name=JDBCDriver        value=COMibmdbjdbcappDBDriver/>      <property name=JDBCConnectionURL        value=jdbc:db:SAMPLE/>      <property name=JDBCUsername        value=dbadmin/>      <property name=JDBCPassword        value=admindb/>    </dataSource>  </transactionManager>  <sqlMap resource=Contactxml/></sqlMapConfig>
  
  SqlMapConfigxml 是SQLMaps的部署描述信息包括以下元素
  
  <sqlMapConfig>是文件的根元素<settings>被用來定義應用程序級別的設置例如 useStatementNamespaces 屬性被用來定義是否要用准備說明的全限定名它可以有一些另外的屬性用於控制緩存和初始化要知道更進一步的細節請查看文檔
  
  <transactionManager> 被用來定義你想要在你的應用程序中使用的事務管理在我們的例程中我們要用Connection 對象的 commit 和 rollback 方法來管理事務所以我們用JDBC作為事項管理程序它包含 <dataSource> 作為子元素<dataSource>用來定義你要使用的連接管理的類型在我們的例程中我們要用SQLMaps自帶的連接池實現如此我們將使用一個SIMPLE類型的數據源為了建立連接池SQLMaps要求像JDBC驅動名稱URL和密碼這些信息因此我們使用<property>元素來傳遞這些信息稍後我們將更加詳細地討論各種各樣可用的事務和連接管理選項
  
  <sqlMap>元素被用來表明 SQLMap 配置文件這些文件如早先討論的列出了你希望執行的SQL查詢
  
   創建一個JavaBean類Contactjava有屬性 firstName lastName 和 contactId 和相應的getset方法這個類將被用來向ResultSet傳遞查詢參數並讀取值
  
  public class Contact implements Serializable{  private String firstName;  private String lastName;  private int contactId;  //Getter setter methods for firstName  //lastName and contactId property}
  
   建立一個Contactxml文件我們將在文件中列出所有要執行的與表Contact有關的SQL查詢
  
  <sqlMap namespace=Contact>  <typeAlias alias=contact    type=ntactContact/>  <select id=getContact    parameterClass=int resultClass=contact>      select CONTACTID as contactId          FIRSTNAME as firstName          LASTNAME as lastName from          ADMINISTRATORCONTACT where CONTACTID = #id#  </select></sqlMap>
  
  文件中使用的標簽如下
  
  <sqlMap>是文件的根元素正常情況下你的應用程序將有不止一個表由於你要把與不同表有關的查詢分開成不同的名稱空間(namespace)<namespace> 元素就是被用來指定在此文件中查詢應被放置的名稱空間
  
  <typeAlias> 用來說明Contact 類的全限定名的一個簡稱在此說明後這個簡稱可以被用來替代全限定名
  
  在SQLMaps架構中 <select> 元素用來聲明SQLMaps架構中的SELECT查詢它的值就是你能指定的要執行的查詢id屬性被用來指定通知SQLMaps 執行特殊查詢的名稱parameterClass 被用來指定傳遞查詢參數的類resultClass 提供從ResultSet返回值的類的名稱
  
   在Action類的 execute() 方法內我們建立了一個SqlMapClient的句柄它被用來和SQLMaps相互作用我們必須向SqlMapClientBuilder傳遞SqlMapConfigxml文件它被用來讀取配置設置
  
  DynaActionForm contactForm =    (DynaActionForm)form;  Reader configReader =    ResourcesgetResourceAsReader(SqlMapConfigxml);  SqlMapClient sqlMap =    SqlMapClientBuilderbuildSqlMapClient(configReader);  Contact contact = (Contact)    sqlMapqueryForObject(getContact          contactFormget(contactId));  requestsetAttribute(contactDetail contact);  return mappingfindForward(success);
  
  當你要執行一個SELECT 查詢時應該使用 SQLMaps 的 queryForObject 方法在Contactxml文件中我們已經指定parameterClass為int所以我們在傳遞查詢的名稱的時候傳遞一個integer作為contactId (ie getContact)
  
  SQLMaps 將返回一個Contact 類的對象
  
  基本數據庫操作
  
  現在我們要返回我們的所關注的使用SQMLaps如何表示一些基本的數據庫操作
  
   Insert操作
  
  我們從如何執行一個開始Insert操作開始
  
  <insert id=insertContact parameterClass=contact>INSERT INTO ADMINISTRATORCONTACT( CONTACTIDFIRSTNAMELASTNAME)    VALUES(#contactId##firstName##lastName#);</insert>
  
  <insert> 元素被用來聲明一個Insert的SQL查詢它有一個parameterClass 屬性用來指明哪個JavaBean類將被用來傳遞(request)請求參數在插入新的記錄時我們要使用contactId屬性的值所以我們必須在SQL查詢中使用一個#contactId#
  
  public void contactInsert() throws SQLException IOException {  sqlMapstartTransaction();  try {  sqlMapstartTransaction();  Contact contact = new Contact();  contactsetContactId();  contactsetFirstName(John);  contactsetLastName(Doe);  sqlMapinsert(insertContactcontact);  mitTransaction();  } finally{    sqlMapendTransaction();  }}
  
  在我們的java代碼中我們建立了一個Contact 對象存放它的值然後調用sqlMapinsert()方法傳遞我們要執行的查詢的名稱和 Contact 這個方法將插入一個新的Contact並且返回新插入的Contact的主鍵
  
  缺省情況下SQLMaps 把每個DML方法當作工作的一個單元但是你能使用 startTransaction commitTransaction 和 endTransaction 方法來劃分事務處理通過調用 startTransaction() 方法你可以啟動一個事務處理此方法也能從連接池中獲得一個連接在這個事務中這個連接對象將被用來執行查詢如果這個事務的所有查詢都被成功執行應該調用 commitTransaction 方法提交你的改動不考慮你的事務成功與否
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27482.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.