所謂的命名sql其實也就是數據庫里的sql語句,普元EOS里做了一定的封裝,以方便在程序中的使用。
命名SQL的基本元素包括:
1. <parameterMap> parameterMap負責將對象屬性映射成statement的參數。
2. <resultMap> resultMap負責將結果集的列值映射成對象的屬性值
3. <statement>(Mapped Statement)元素是個通用聲明,可以用於任何類型的sql語句,
但具體的statement類型(即<insert>、<update>、<delete>、<select>、<procedure>)
提供了更直觀的XML DTD,因此強烈推薦使用。下表總結了statement類型及其屬性:Statement類型 屬性

《一》對於各個statement的用法舉例:
(1)如果在腳本或樣式表中使用特殊字符(例如< 或&)或實體引用(例如< 或&),則需要將腳本或樣式表的內容標記為CDATA(字符數
據)節,如果不使用CDATA的話就必須使用相應的實體來代替,例如<必須用<來替換
(2) 命名Sql中參數用##包起來,生成的是PreparedStatement,還可以使用$$把參數包起來,這樣生成的是Statement,就是說在執行sql時
會先把參數放入到sql中,一般用在like或in操作中。對於in操作寫命名Sql時,參數不能寫成in(#field#)的方式,而應該寫成
in ($filed$)的方式,原因是in操作不支持preparedStatement。
<updateid="saveExamineInfo"parameterClass="java.util.HashMap" >
<![CDATA[
UPDATE $mainTableName$ T SET T.MAIN_CHECK1 = '$mainCheck1$' ,T.MAIN_CHECK2 = '$mainCheck2$'
WHERE T.MAIN_ID = $mainId$
]]></update>
<deleteid="deleteTemplate"parameterClass="java.util.HashMap">
<![CDATA[
delete from IPTSM_TEMPLATEINFO where no = $no$
]]></delete>
<selectid="getTemplateInfo"parameterClass="java.util.Map" resultClass="commonj.sdo.DataObject" ">
<![CDATA[
SELECT NO,IDENTIFY,TITLE, FILENAME,TO_CHAR(MODIFYDATE,'yyyy-MM-dd HH24:mi:ss') MODIFYDATE
from IPTSM_TEMPLATEINFO where identify = '$identify$' AND TITLE LIKE '%$title$%' order by MODIFYDATE desc]]>
</select>
<procedure id="swapEmailAddresses" parameterMap="swapParameters">
{call swap_email_address (?, ?)}
</procedure>
將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來, 那么以后要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令
存儲過程的優點:
1.存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程
可提高數據庫執行速度。
2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的
事務處理結合一起使用。
3.存儲過程可以重復使用,可減少數據庫開發人員的工作量
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
《二》parameterMap
parameterMap負責將對象屬性映射成statement的參數。
<parameterMap id="parameterMapName"class="commonj.sdo.DataObject">
<parameter property ="propertyName"
[jdbcType="VARCHAR"]屬性javaType用於顯式地指定被賦值參數的類型。如果沒有提供類型將被假定為Object類型。
[javaType="string"]屬性javaType用於顯式地指定被賦值參數的類型。如果沒有提供類型將被假定為Object類型。
[nullValue="NUMERIC"]屬性nullValue的值可以是對於property類型來說任意的合法值,用於指定NULL的替換值。就是說,當屬性值等於指定值時,相應的字段將賦值NULL。這個特性允許在應用中給不支持null的數據類型(即int,double,float等)賦值null。
/>
<parameter ...... />
<parameter ...... />
</parameterMap>
括號[]是可選的屬性。一個parameterMap可包含任意多的parameter元素。后面討論parameter的各個屬性
《三》resultMap
在命名SQL框架中,Result Map是極其重要的組件。在執行查詢Mapped Statement時,resultMap負責將結果集的列值映射成對象的屬性值。resultMap的結構如下:
<resultMap id="resultMapName"class="commonj.sdo.DataObject">
<result property="propertyName"column="COLUMN_NAME"[columnIndex="1"]
[javaType="int"] [jdbcType="NUMERIC"] [nullValue="-999999"] />
<result .../>
<result .../>
</resultMap>
括 號[]中是可選的屬性。resultMap的id屬性是唯一標識。ResultMap的class屬性用於指定DataObject的類型名稱(包括 URI)。resultMap可以包括任意多的屬性映射,將查詢結果集的列值映射成DataObject的屬性。屬性的映射按它們在resultMap中 定義的順序進行
下面我們舉例說明:
<?xml version="1.0" encoding="UTF-8"?>
<!-- author:asus -->
<sqlMap>
<parameterMap class="commonj.sdo.DataObject" id="parameterMap">
<parameter javaType="date" jdbcType="DATE" property="dateType"/>
</parameterMap>
<resultMap class="commonj.sdo.DataObject" id="resultMap">
<result column="TYPEID" javaType="string" property="typeId"/>
</resultMap>
<select id="select_id" parameterClass="java.util.HashMap" resultClass="commonj.sdo.DataObject"><![CDATA[
select nvl(s.tdhisrownum, 0) as tdhisrownum,
decode(nvl(s.customer_name, '0'), '0', '合計', s.customer_name) as customer_name,
s.pack_sell_id,
s.pack_sell_code,
s.pack_sell_name,
sum(s.sell_num) as sell_num,
s.mscell_name,
s.gcmaxdate,
sum(s.gctic) as gctic,
sum(s.realticsum) as realticsum,
sum(s.dktic) as dktic,
sum(s.gcticincome) as gcticincome,
sum(s.realticincome) as realticincome,
sum(s.dkticincome) as dkticincome,
s.empname,
s.hxdate,
case s.hasproblem
when 'p1' then '有'
when 'p2' then '無'
else null end as hasproblem,
case s.pronature
when '1' then '資金緊張'
when '2' then '項目問題'
when '3' then '客戶問題'
when '4' then '其他問題'
else null end as pronature,
s.prodesc,
s.solutions,
s.orgid,
s.orgname
from dp_report_packtictdhis s
]]>
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="orw1">
s.dktic > 0
</isNotNull>
<isNotNull prepend="AND" property="customerName">
customer_name like '$customerName$'
</isNotNull>
<isNotNull prepend="AND" property="packSellCode">
pack_sell_code like '%$packSellCode$%'
</isNotNull>
<isNotNull prepend="AND" property="packSellName">
pack_sell_name like '%$packSellName$%'
</isNotNull>
<isNotNull prepend="AND" property="empname">
empname like '%$empname$%'
</isNotNull>
<isNotNull prepend="AND" property="orgname">
orgname like '%$orgname$%'
</isNotNull>
<isNotNull prepend="AND" property="hasproblem">
hasproblem like '%$hasproblem$%'
</isNotNull>
<isNotNull prepend="AND" property="pronature">
pronature like '%$pronature$%'
</isNotNull>
<isNotNull prepend="AND" property="hxdate">
hxdate >= to_date('$hxdate$','yyyy-mm-dd hh24:mi:ss')
</isNotNull>
<isNotNull prepend="AND" property="tohxdate">
hxdate <= to_date('$tohxdate$','yyyy-mm-dd hh24:mi:ss')
</isNotNull>
<isNotNull prepend="AND" property="gcmaxdate">
gcmaxdate >= to_date('$gcmaxdate$','yyyy-mm-dd hh24:mi:ss')
</isNotNull>
<isNotNull prepend="AND" property="togcmaxdate">
gcmaxdate <= to_date('$togcmaxdate$','yyyy-mm-dd hh24:mi:ss')
</isNotNull>
</dynamic>
group by rollup((s.tdhisrownum,s.customer_name, s.pack_sell_id, s.pack_sell_code,
s.pack_sell_name, s.mscell_name, s.gcmaxdate, s.empname,
s.hxdate, s.hasproblem, s.pronature, s.prodesc,
s.solutions, s.orgid,s.orgname))
order by tdhisrownum asc,s.hxdate asc
</select>
</sqlMap>
