javaEE--ibatis--Sping+flex4 呼叫儲存過程返回List結果集
1. 這段時間在看儲存過程的優劣性並嘗試提高程式的執行效能,
儲存過程能夠:
a:降低網路流量
b:執行計劃,儲存過程在首次執行是將產生一個執行計劃。
c:使用儲存過程能夠增強對執行計劃的重複使用,從而也可以通過使用遠端過程呼叫RPC處理伺服器上的儲存過程而提高效能,RPC封裝引數和呼叫伺服器端過程的方式使引擎能夠輕鬆地找到匹配的執行計劃,並只需插入更新的引數值。
d:可維護性高,更新儲存過程比更改、測試以及重新部署程式集需要的時間少。
e:程式碼精簡一直,一個儲存過程可以用於程式程式碼的不同位置。
f:更好的版本控制,可以輕鬆的回覆和更新儲存過程的引用。
g:安全性更高,能有效防止sql注入。除了DML附帶的sql引數。
缺點:
可移植性差,不善維護,程式碼可讀性不強,無法採用面向物件的思想對儲存過程進行封裝設計,從而無法形成可複用的業務邏輯框架。
2. 看了下優缺點,然後來簡單的呼叫下儲存過程,學習開始了...... 以前還沒怎麼用過儲存過程。
環境:J2EE+Ibatis2+Flex4 +Spring
接下來直接進入主題,看下Java通過Ibatis呼叫儲存過程並返回結果的關鍵例子。
儲存過程:
create or replace
PROCEDURE METERLISTPRO
(
ML OUT SYS_REFCURSOR ,
SZ OUT INTEGER
) AS
BEGIN
OPEN ML FOR SELECT * FROM METERINFO;
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM METERINFO ' INTO SZ;
END METERLISTPRO;create or replace
PROCEDURE SYSDATAFUNC
(
nowtime OUT DATE
) AS
seledate Date;
BEGIN
execute immediate 'select sysdate from dual ' into nowtime;
END SYSDATAFUNC;sqlMap配置檔案:
<parameterMap id="dd" class="map">
<parameter property="nowtime" javaType="java.util.Date" jdbcType="TIMESTAMP" mode="OUT" />
</parameterMap>
<procedure id="sysDateProcdure" parameterMap="dd" >
<![CDATA[
{CALL SYSDATAfUNC(?)}
]]>
</procedure>
<typeAlias alias="meterinfo" type="com.roy.beans.Meterinfo"/>
<resultMap class="com.roy.beans.Meterinfo" id="meterinfoMap">
<result property="meterid" column="meterid" />
<result property="rtuid" column="rtuid" />
<result property="deviceno" column="deviceno" />
<result property="meterno" column="meterno" />
<result property="metertype" column="metertype" />
<result property="meteradd" column="meteradd" />
<result property="meteropenedtime" column="meteropenedtime" />
<result property="metergasclass" column="metergasclass" />
<result property="meterinitscale" column="meterinitscale" />
<result property="meterfluxchannelno" column="meterfluxchannelno" />
<result property="metervalvechannelno" column="metervalvechannelno" />
<result property="meterinstalltime" column="meterinstalltime" />
<result property="metermaxflux" column="metermaxflux" />
<result property="meterminflux" column="meterminflux" />
<result property="changeflag" column="changeflag" />
<result property="spareflag" column="spareflag" />
<result property="newflag" column="newflag" />
<result property="maxvalue" column="maxvalue" />
<result property="minvalue" column="minvalue" />
<result property="modelno" column="modelno" />
<result property="tsyhbm" column="tsyhbm" />
<result property="valveflag" column="valveflag" />
<result property="fluxflag" column="fluxflag" />
<result property="testflag" column="testflag" />
<result property="maxtemp" column="maxtemp" />
<result property="mintemp" column="mintemp" />
<result property="maxpress" column="maxpress" />
<result property="minpress" column="minpress" />
<result property="factoryno" column="factoryno" />
<result property="measurementtype" column="measurementtype" />
<result property="pitno" column="pitno" />
<result property="unitid" column="unitid" />
<result property="areaid" column="areaid" />
<result property="pwno" column="pwno" />
<result property="serialno" column="serialno" />
<result property="gelimodelno" column="gelimodelno" />
<result property="pressunit" column="pressunit" />
<result property="meterlevel" column="meterlevel" />
<result property="presstype" column="presstype" />
</resultMap>
<parameterMap class="java.util.HashMap" id="pm">
<parameter property="ml" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" resultMap="meterinfoMap" mode="OUT"/>
<parameter property="sz" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
</parameterMap>
<procedure id="meterlist" parameterMap="pm" >
<![CDATA[
{CALL METERLISTPRO(?,?)}
]]>
</procedure>方法呼叫實現類:
public Date getSysDate() {
Date d = null;
Map map = new HashMap();
try {
this.getSqlMapClientTemplate().queryForObject("testnsp.sysDateProcdure",map);
d = (Date)map.get("nowtime");
} catch (DataAccessException e) {
e.printStackTrace();
}
return d;
}@Override
public Map procedureList() {
Map mapm = new HashMap();
try {
this.getSqlMapClientTemplate().queryForList("testnsp.meterlist",mapm);
} catch (DataAccessException e) {
e.printStackTrace();
}
return mapm;
}