最近做一东西,用了很多存储过程。然后,就用到了spring的StoredProcedure执行sql存储过程。但是,我想如果执行存储过程的结果后,返回值不正确的话,就回滚。但是我该在哪加,怎么加代码呢。下面贴出源码:package bk.utils;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.StoredProcedure;
public class ExecPro extends StoredProcedure {
// 声明一个用于接收结果集的数据结构,其中的元素为row,用map存放
public ArrayList<HashMap> alist = new ArrayList<HashMap>();
private Map inParam;//输入参数
/**
* 结果的处理
* @author ouming
*/
public class DemoRowMapper implements RowCallbackHandler {
public void processRow(ResultSet rs) throws SQLException{
int rowCount = rs.getRow();
System.out.println("*******************************************");
System.out.println("总行数:"+rowCount);
System.out.println("*******************************************");
int count = rs.getMetaData().getColumnCount();
String[] header = new String[count];
for(int i=0;i<count;i++)
header[i] = rs.getMetaData().getColumnName(i+1); //取列名
do{ //这里是先取值再结果集下移,与java的一般写法不同
HashMap<String,String> row = new HashMap(count+7);
for(int i=0;i<count;i++)
row.put(header[i],rs.getString(i+1)); //一行记录由列名,值对存入map中
}while(rs.next());
}
}; //DemoRowMapper作为输出参数的回调句柄
public ExecPro(DataSource ds, String SQL) {
setDataSource(ds);
setSql(SQL);
}
public void setOutParameter(String column,int type){
declareParameter(new SqlOutParameter(column, type,new DemoRowMapper()));//利用回调句柄注册输出参数
}
public void setParameter(String column,int type){
declareParameter(new SqlParameter(column, type)); //设置输入输数
}
public void SetInParam(Map inParam){
this.inParam = inParam;
}
public Map execute() {
compile();//编译
return execute(this.inParam);
}
}下面是调用代码:
package bk.utils;import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import bk.utils.db.DBService;
import bk.utils.ExecPro;
import java.sql.Connection;
/*这里都是存储过程
*/
public class SP{
private static SP convert = null;
private SP(){}
public static SP getInstance(){
if(convert==null){
convert = new SP();
}
return convert;
}
public String auditDJ(String cdh,String shr){
String ret="审核失败!";
ExecPro sp = new ExecPro(DBService.getJdbcTemplate().getDataSource(),"GP_Check");
sp.setParameter("CDH",java.sql.Types.CHAR);
sp.setParameter("SHR",java.sql.Types.CHAR);
sp.setOutParameter("errcode",java.sql.Types.VARCHAR);
sp.setFunction(false);
// 传入输入参数值
Map in = new HashMap();
in.put("CDH",cdh);
in.put("SHR",shr);
sp.SetInParam(in);
// 执行存储过程
Map m=sp.execute();
if(m.containsValue(null)) return ret;
else ret = m.get("errcode").toString();
return ret;
}
}
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.StoredProcedure;
public class ExecPro extends StoredProcedure {
// 声明一个用于接收结果集的数据结构,其中的元素为row,用map存放
public ArrayList<HashMap> alist = new ArrayList<HashMap>();
private Map inParam;//输入参数
/**
* 结果的处理
* @author ouming
*/
public class DemoRowMapper implements RowCallbackHandler {
public void processRow(ResultSet rs) throws SQLException{
int rowCount = rs.getRow();
System.out.println("*******************************************");
System.out.println("总行数:"+rowCount);
System.out.println("*******************************************");
int count = rs.getMetaData().getColumnCount();
String[] header = new String[count];
for(int i=0;i<count;i++)
header[i] = rs.getMetaData().getColumnName(i+1); //取列名
do{ //这里是先取值再结果集下移,与java的一般写法不同
HashMap<String,String> row = new HashMap(count+7);
for(int i=0;i<count;i++)
row.put(header[i],rs.getString(i+1)); //一行记录由列名,值对存入map中
}while(rs.next());
}
}; //DemoRowMapper作为输出参数的回调句柄
public ExecPro(DataSource ds, String SQL) {
setDataSource(ds);
setSql(SQL);
}
public void setOutParameter(String column,int type){
declareParameter(new SqlOutParameter(column, type,new DemoRowMapper()));//利用回调句柄注册输出参数
}
public void setParameter(String column,int type){
declareParameter(new SqlParameter(column, type)); //设置输入输数
}
public void SetInParam(Map inParam){
this.inParam = inParam;
}
public Map execute() {
compile();//编译
return execute(this.inParam);
}
}下面是调用代码:
package bk.utils;import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import bk.utils.db.DBService;
import bk.utils.ExecPro;
import java.sql.Connection;
/*这里都是存储过程
*/
public class SP{
private static SP convert = null;
private SP(){}
public static SP getInstance(){
if(convert==null){
convert = new SP();
}
return convert;
}
public String auditDJ(String cdh,String shr){
String ret="审核失败!";
ExecPro sp = new ExecPro(DBService.getJdbcTemplate().getDataSource(),"GP_Check");
sp.setParameter("CDH",java.sql.Types.CHAR);
sp.setParameter("SHR",java.sql.Types.CHAR);
sp.setOutParameter("errcode",java.sql.Types.VARCHAR);
sp.setFunction(false);
// 传入输入参数值
Map in = new HashMap();
in.put("CDH",cdh);
in.put("SHR",shr);
sp.SetInParam(in);
// 执行存储过程
Map m=sp.execute();
if(m.containsValue(null)) return ret;
else ret = m.get("errcode").toString();
return ret;
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货