1、首先对 org.hibernate.jdbc.Work 接口封装
package com.cms.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.jdbc.Work;
public abstract class ProWork implements Work{
private String proSql; //存储过程语句
private ResultSet rs = null; //返回结果集
private Map pro = new HashMap(); //存储过程涉及参数
@Override
public abstract void execute(Connection conn) throwsSQLException;
public ProWork(String proSql,Object... params){
this.proSql = proSql;
int i=1;
for(Object obj:params){
pro.put(i, obj);
i++;
}
}
public void setParams(Integer key,Object value){
pro.put(key, value);
}
public String getProSql() {
return proSql;
}
public void setProSql(String proSql) {
this.proSql = proSql;
}
public Object getParams(Integer key){
return pro.get(key);
}
public ResultSet getRs() {
return rs;
}
public void setRs(ResultSet rs) {
this.rs = rs;
}
}
2、在 Dao 实现类中方法
public ResultSet executeProRs(ProWork work){
Session session = sessionFactory.getCurrentSession();
session.doWork(work);
return work.getRs();
}
3、在service 层中调用 dao
ResultSet rs = gdi.executeProRs(new ProWork("{call******.*********(?,?)}","2013-12-03"){
//新建ProWork 抽象类 ,第一个参数为存储过程调用语句,之后的参数为不定长参数。游标参数不用传入!
//实现ProWork 抽象方法。
@Override
public void execute(Connection conn) throws SQLException{
// TODO Auto-generated method stub
CallableStatement statement =conn.prepareCall(this.getProSql());
//为存储过程设置参数,用this.getParams(Index ) 获取传入参数。
statement.setString(1, this.getParams(1).toString());
statement.registerOutParameter(2, OracleTypes.CURSOR);
statement.execute();
//将存储过程返回游标结果赋值给ResultSet.
this.setRs((ResultSet) statement.getObject(2));
}
});
转自: http://blog.sina.com.cn/s/blog_49dff6130101ij37.html