java调用存储过程的通用封装_使用java调用存储过程的通用封装

/*** 执行存储过程

*

*@paramprocedure过程名

*@paramsqlType

*            返回值类型,无返回值传null

*@paramprocedureCallBack

*            回调对象

*@return*/privateProcedureResult execProc(String procedure, Integer sqlType,

ProcedureCallBack procedureCallBack) {

Connection conn=null;

Statement stmt=null;

ResultSet rs=null;

ProcedureResult procResult=newProcedureResult();try{

procedureCallBack.jt=this;

conn=getConnection();//取连接procedureCallBack.registerParameter();//计算参数的个数intparameterSize=procedureCallBack.parametersCount;//取参数的个数procedureCallBack.parametersCount=0;if(parameterSize>0)

procedure=procedure+getProcParameters(parameterSize,"?");//根据参数的个数拼装sqlString sql="{"+(sqlType!=null?"?=":"")+"call"+procedure+"}";

logger.debug("exec"+sql);

CallableStatement cstm=conn.prepareCall(sql);//预编译过程procedureCallBack.cstm=cstm;

procedureCallBack.startParametersIdx=sqlType!=null?1:0;//对外界忽略带返回值过程的参数下标if(sqlType!=null)

procedureCallBack.registerOutParameter(0, sqlType.intValue());//注册带返回值过程的返回类型oracle不支持mssql支持procedureCallBack.registerParameter();//注册参数booleanresults=cstm.execute();//执行过程intrsIndex=1;//结果集个数计数器for(; results; rsIndex++) {

rs=cstm.getResultSet();//取当前结果集List list=newArrayList();//为当前结果集创建一个容器while(rs.next())

list.add(procedureCallBack.mapRow(rs, rsIndex));

procResult.addRs(list);

results=cstm.getMoreResults();//取下一个结果集}

Map map=procedureCallBack.getOutParameters();//取声明的out参数,Iterator iterator=map.keySet().iterator();//遍历声明的out参数while(iterator.hasNext()) {

String key=iterator.next().toString();//out参数类型intidx=Integer.valueOf(key).intValue();if(newInteger(-10).equals(map.get(key))) {//oracle结果集列表是通过游标的形式利用out参数输出的oracle.jdbc.OracleTypes.CURSOR的值是-10closeResultSet(rs);//关闭上次使用的结果集rs=(ResultSet) cstm.getObject(Integer.valueOf(key)

.intValue());//从out参数中取结果集List list=newArrayList();//为当前结果集创建一个容器while(rs.next())

list.add(procedureCallBack.mapRow(rs, rsIndex));

rsIndex++;//结果集计数器累加procResult.addRs(list);

}elseif(idx==1&&sqlType!=null)//如果过程有返回值,从第一个out参数中取得这个返回值procResult.setValue(JdbcUtils.getCallableStatementValue(

cstm, idx));elseprocResult.getOutput().add(

JdbcUtils.getCallableStatementValue(cstm, idx));//取的普通的out参数输出到out输出容器}if(sqlType==null&&procResult.getOutput().size()>0)//如果过程没用返回值,例如oracle过程根本不支持返回值,将第一个非游标的out参数返回值当作过程返回值procResult.setValue(procResult.getOutput().get(0));

}catch(SQLException e) {thrownewDataAccessException(e);

}finally{

closeResultSet(rs);

closeStatement(stmt);

closeConnection(conn);

}returnprocResult;

}publicclassProcedureResult {privateList rs=newArrayList();//过程返回的n个结果集列表privateList output=newArrayList();//过程的out参数输出privateObject value;//过程本身的返回值略

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值