IBATIS调用oracle存储过程——获取返回值
成百万数据量的表我们经常会加上表索引以方便查询,但是如果对这样的表经行数据批量修改的时候,一般我们用普通的update语句经行批量修改,这样的话大数据量造成修改上的性能问题是可想而知的。
存储过程则更适合对数据库的更新,尤其是大量数据的更新。
普通的sql接口更新数据库,如果更新复杂而频繁,那么可能需要频繁连接数据库。众所周知连接数据库是非常耗时和消耗资源的。如果所有工作都交由一个存储过程来完成,那么将大大将少数据库的连接频率,从而提高数据库的执行效率。
有点跑题,现在需要说的是存储过程的返回值。
下边写的是一个简单的对用户表的修改存储过程:
create or replace procedure update_user_info(in_user_name in varchar2,
in_user_age in varchar2,
S_RESULT OUT VARCHAR2) AS
begin
update test_user_t t
set t.user_name = in_user_name, t.user_age = in_user_age
where t.user_id in('7', '51', '60');
commit;
S_RESULT := 'OK';
EXCEPTION
WHEN OTHERS THEN
S_RESULT := 'NOOK';
ROLLBACK;
end update_user_info;
之后是用IBATIS写的一个sqlMap
<parameterMap id="updateParameters" class="map" >
<parameter property="USER_NAME" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="USER_AGE" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="S_RESULT" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
</parameterMap>
<procedure id="UserDAO.update_user_info" parameterMap="updateParameters" >
{call update_user_info (?, ?, ?)}
</procedure>
再后是Javacode Spring模板在DaoImpl层的代码——修改用户信息,红色的部分是测试存储过程返回值的代码。
public int updateUserInfo(HashMap param) throws DataAccessException {
int count=0;
try {
//getSqlMapClientTemplate().update("UserDAO.updateUserInfo", param);
//下边代码为测试存储过程修改表数据,存储过程适用于大数据量的修改。
HashMap map = new HashMap();
String RESULT="";
map.put("USER_NAME", "zhanglujie");
map.put("USER_AGE", "25");
map.put("S_RESULT", RESULT);//存放map的返回值
getSqlMapClientTemplate().update("UserDAO.update_user_info", map);
System.out.println("returnValue:"+map.get("S_RESULT")+"-------------------");
count++;
return count;
} catch (Exception e) {
e.printStackTrace();
logger.info("UserDAO.updateUserInfo------------------->出现异常");
}
return count;
}
执行成功结果是:returnValue:OK-------------------