Spring+ibatis

來源:互聯網
上載者:User
 

Spring提供了一套成熟而全面的基礎架構,站在應用開發的實際角度來說,其最大的優勢在於:Spring是一個從實際項目開發經驗中抽取的,可高度重用的應用程式框架。Spring Framework中目前最令人信服的,也就是名為控制反轉(IOC =Inverse Of Control)或者依賴注入(DI =Dependence Injection)的設計思想。IoC,就是由容器控製程序之間的關係,而非傳統實現中,由程式碼直接操控。這也就是所謂“控制反轉”的概念所在:控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。所謂依賴注入,即組件之間的依賴關係由容器在運行期決定,形象的來說,即由容器動態將某種依賴關係注入到組件之中,實現了組件真正意義上的隨插即用。這也是Spring最具價值的特性之一但是,光一個單純的設計模式並不能使得Spring如此成功,而Spring最成功的地方也並不僅僅在於採用了IOC/DI的設計。首先,Spring涵蓋了應用系統開發所涉及的大多數技術範疇,包括MVC、ORM以及RemoteInterface等,這些技術往往貫穿了大多數應用系統的開發過程。Spring從開發人員的角度對這些技術內容進行了進一步的封裝和抽象,使得應用開發更為簡便。其次,Spring並非一個強制性架構,它提供了很多獨立的組件可供選擇。 一個依賴注入的例子
<beans><bean id="dataSource"class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiName"><value>java:comp/env/sample</value></property></bean><bean id="SampleDAO" class="com.SampleDAO"><property name="dataSource"><ref local="dataSource"/></property></bean></beans>
其中SampleDAO中的dataSource將由容器在運行期動態注入,而DataSource的具體配置和初始化工作也將由容器在運行期完成。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何代碼就可指定SampleDAO中所需的DataSource執行個體。SampleDAO只需利用容器注入的DataSource執行個體,完成自身的商務邏輯,而不用關心具體的資源來自何處、由誰實現。  ibatis與Hibernate類似也是一個ORM解決方案。相對Hibernate和Apache OJB 等“一站式”ORM解決方案而言,ibatis 是一種“半自動化”的ORM實現。這裡的“半自動化”,是相對Hibernate等提供了全面的資料庫封裝機制的“全自動化”ORM 實現而言,“全自動”ORM 實現了POJO 和資料庫表之間的映射,以及SQL 的自動產生和執行。而ibatis 的著力點,則在於POJO 與SQL之間的映射關係。也就是說,ibatis並不會為程式員在運行期自動產生SQL 執行。具體的SQL 需要程式員編寫,然後通過映射設定檔,將SQL所需的參數,以及返回的結果欄位對應到指定POJO。使用ibatis 提供的ORM機制,對商務邏輯實現人員而言,面對的是純粹的Java對象,這一層與通過Hibernate 實現ORM 而言基本一致,而對於具體的資料操作,Hibernate會自動產生SQL 陳述式,而ibatis 則要求開發人員編寫具體的SQL 陳述式。相對Hibernate等“全自動”ORM機制而言,ibatis 以SQL開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。 一個簡單的配置
<select id="getUser" parameterClass="java.lang.String" resultClass="java.util.HashMap"> <![CDATA[ select name, sex from t_user where name = #name# ]]></select>
通過對sql語句配置的id(getUser)可以非常輕鬆的通過ibatis中的SqlMapClient對象將查詢的記錄集封裝在對象取出。Map user = (Map)sqlMap.queryForObject("getUser",name);這樣一來就可以實現對sql語句的配置化,即將sql語句從Bean中分離出來,這對後期的維護工作非常有協助。僅僅對sql語句的配置化只是其優點之一,它還有很多非常實用的功能,比如查詢的動態映射功能(即通過查詢頁面提交的條件來動態組合sql),分頁功能等等。 我們通過Struts在項目中的運用已經對MVC的開發模式有了比較深刻的理解,只是對於資料持久層,解決得不是很好,因此有必要掌握一種比較流行而且適合我們開發的ORM,ibatis就是其中的一種, 目前在我們的項目中運用的技術不外乎兩種jsp+bean和struts,這些技術比較落後了,因此有必要掌握先進的技術,為了公司的技術積累,同時也是為了自身的發展。我們應該用MVC的模式來開發新的項目,用spring framework做為控制器(C),用jsp頁面作為顯示頁面(V)用ibatis作為資料持久層,並結合java bean來作開發。 控制器Spring的控制器分為兩種,一種是簡單控制器,另一種是form控制器,Form控制器是通過commonClass屬性將指定的bean與jsp頁面上的表單輸入框進行綁定,來達到表現層與控制層的資料轉送目的,通過Validation屬性來對資料的有效性進行校正,通過error對象來封裝錯誤資訊並與commonClass屬性指定的bean相結合達到錯誤資訊與表單對象綁定的目的。簡單控制器只是對請求進行處理,與Form控制器不同它沒有表單綁定和資料校正的功能,相當於一個servlet,使用簡單控制器擷取jsp提交過來的資料是通過request.getParameter和request.getParameterValues方法,通過new ModelAndView(returnView, model)方法將資料對象發送到頁面(model一般是一個封裝了資料的Map對象)。對比兩種控制器,簡單控制器更簡單和實用,Form控制器比較複雜,需要寫與表單綁定的bean(不能用Map來代替),可能還需要寫與之相配合使用的資料校正,這無疑會增加不少工作量,同時對於主從表形式的表單的封裝還沒有找到很好的解決方案,因此應該選擇簡單控制器,簡單控制器可以通過Map的形式來封裝頁面請求資料,這樣可以少寫或不寫vo對象來映射資料庫中的對象,麻煩的地方就是對請求對象中的資料的填充,不過目前已經解決了此不足之處,同時實現了主從表形式的表單資料的傳遞。目前我的做法是這樣的,先寫一個抽象類別SimpleController來實現AbstractController的介面,在SimpleController中加入一些比較公用的屬性和對象,比如formView,successView等,將AbstractController的handleRequestInternal (HttpServletRequest req, httpServletResponse response)方法抽象出來交由繼承SimpleController的子類中實現,其它的控制器都繼承於SimpleController控制器,在控制器擷取請求後通過一個Map fillMap(String[] fieldNames, HttpServletRequest request)或List fillMaps(String[] fieldNames, HttpServletRequest request)方法將表單中的資料封裝在Map或List中,然後再對Map或List進行其它的操作,比如對資料有效性進行校正、發送到資料持久層進行增刪改查等操作,處理完後再用Map對各種資料和錯誤資訊進行封裝,然後發送到頁面通過<c:out>標籤輸出。  資料持久層資料持久層應該充分的發揮ibatis中的功能。Ibatis中支援Map對象作為sql語句中的傳入參數,同對也支援將查詢的結果集以Map的形式進行封裝,因此應該用Map來代替ibatis使用中的各種對象,配合控制器中Map使用達到簡化開發流程,提高開發效率的目的。對於資料訪問的交易處理,spring和ibatis中都提供了相應功能,使用spring管理事務比較複雜,需要寫各種介面和Data Access ObjectsDAO,這樣符合物件導向的編程思想同時對我們的編程水平有很大的提高,但是對於開發時間極短的項目來說是不合適的,因此為了到達簡單,快速的目的,直接使用ibatis中的交易處理機制管理事務,我的做法是在控制器中直接使用Try{sqlMap.startTransaction();//開啟事務……sqlMap.commitTransaction();//提交事務}Finally{sqlMap.endTransaction();//結束事務}對事務進行控制,  視圖視圖使用jsp檔案來輸出,表單上的輸入框直接用標準的html語言,邏輯、迴圈和輸出則通過jstl的標籤實現。頁面上的js函數都以js檔案的形式include進來,這樣修改一個js函數,所有用到該函數的頁面都不用改動。對於頁面輸入校正直接用javascript處理,對於頁面上的動態效果通過樣式表配合htc檔案和javascript完成。  日誌輸出對於開發中進行調試的資訊統一用log4j組件來輸出,  異常處理統一使用spring中提供的異常處理機制,各模組中只用將發生的異常拋出,剩下的事情由spring中設定的異常的監聽來完成。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.