第一步先来了解一个类 StoredProcedure 是一个抽象类 ,你需要自己扩展其实现
下面我们以实例来讲解。
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class MyJDBC {
private static DataSource dataSource = null;
public static Object executeProcedure(final String proc,
LinkedHashMap inParams, LinkedHashMap outParams) {
Map map = inParams;//参数列表
HashMap struct = new HashMap();
struct.put("dataSource", getDataSource());//数据源
struct.put("sql", proc);//执行存储过程名称
struct.put("in", inParams);//输入参数
struct.put("out", outParams);//输出参数
MyStoredProcedure st = new MyStoredProcedure(struct);//构造扩展的StoredProcedure
return st.execute(map);//执行
}
public static DataSource getDataSource() {
if (dataSource == null)
dataSource = new DriverManagerDataSource(
"oracle.jdbc.OracleDriver",
"url", "username",
"password");
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
第二步 编写扩展的StoredProcedure
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.sql.DataSource;
import oracle.jdbc.OracleTypes; import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.StoredProcedure;
public class MyStoredProcedure extends StoredProcedure {
public MyStoredProcedure(Map<String, Object> param) {
for (Entry<String, Object> p : param.entrySet()) {
String keyName = p.getKey();
Object value = p.getValue();
if ("dataSource".equals(keyName))
setDataSource((DataSource) value);
else if ("sql".equals(keyName))
setSql((String) value);
else if ("in".equals(keyName))
setInParameter((LinkedHashMap) value);
else
setOutParameter((LinkedHashMap) value);
}
compile();
}
private void setOutParameter(LinkedHashMap value) {
for (Iterator iterator = value.keySet().iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
Object object = value.get(name);
SqlParameter sqlParameter = null;
if (object instanceof String)
sqlParameter = new SqlOutParameter(name, OracleTypes.VARCHAR);
else if (object instanceof Integer)
sqlParameter = new SqlOutParameter(name, OracleTypes.NUMBER);
declareParameter(sqlParameter);//声明输出参数类型
}
}
private void setInParameter(LinkedHashMap value) {
for (Iterator iterator = value.keySet().iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
Object object = value.get(name);
SqlParameter sqlParameter = null;
if (object instanceof String)
sqlParameter = new SqlParameter(name, OracleTypes.VARCHAR);
else if (object instanceof Integer)
sqlParameter = new SqlParameter(name, OracleTypes.NUMBER);
declareParameter(sqlParameter);//声明输入参数类型
}
}
}
好了 可以测试了 是不是很简单啊
LinkedHashMap inParams = new LinkedHashMap();
inParams.put("fuWuHaoMa", "");
inParams.put("address", "");
LinkedHashMap outParams = new LinkedHashMap();
outParams.put("result_msg", Types.VARCHAR);
System.out.println(MyJDBC.executeProcedure("存储过程名称", inParams,
outParams));