以Ext+Struts+Srping+iBatis組合方式爲例,這四個組件分工協作,如何讓協作更有效開發更敏捷?
1.Ext作爲呈現層,主要作爲數據的呈現和數據的組織;
2.Action作爲請求和跳轉的門面,將Ext中的Json請求數據或者XML請求數據轉爲Java對象,並調用不同的Service實例進行處理;
3.Spring的DI、AOP、事務管理爲開發帶來了高效的實現和耦合度的降低。
4.iBatis主要作用實現對象和關係(數據庫)的映射。
問題:
查詢往往是一個項目或者產品中最爲出色、使用頻繁的功能,iBatis的強大之處在於手寫SQL語句方便靈活,便於實現高效的查詢,這一點對於項目特別是大數據量的項目是非常有效的。同時這也是iBatis來說也是很大的缺血,即手寫SQL的內容龐大,諸如刪除、修改、增加操作往往不需要很大的靈活性,這點Hibernate做的就更出色了,如此iBatis一定程度上也降低了開發的效率。同時iBatis對查詢的支持也是有諸多不便之處的。
我們來看這樣的一組查詢語句:
SELECT field1,field2,field3,....,fieldn,... FROM table_name WHERE expression1 AND expression2 or expression2 ... AND ... or ....ORDER BY field1 ASC, field2 DESC,...
這樣的SQL語句是很普通的查詢,如果用iBatis會怎麼樣呢?下面給出iBatis的一種實現方式:
<select id="identify" resultMap="beanMap">
SELECT field1,field2,field3,....,fieldn,... FROM table_name
<dynamic prepend="WHERE">
<isNotEmpty property="property1" prepend="AND">
field1= #property1#
</isNotEmpty >
<isNotEmpty property="property2" prepend="OR">
field1 = #property2#
</isNotEmpty> ....
</dynamic>
ORDER BY field1 ASC, field2 DESC,...
</select>
這樣的iBatis配置SQL語句存在什麼問題嗎?相信仔細觀察我們就能發現問題:
WHERE條件是動態的,其他如查詢字段、排序字段都是靜態寫死了的。當然這樣的SQL配置寫法能夠滿足80%以上的查詢需求,可是那剩下的20%呢?熟悉二八定律的人都知道20%在項目中的舉足輕重,那麼我們怎麼改造這個SQL語句配置呢?
(待續... ...)