Hibernate4 针对存储过程的接口封装

来源:互联网 发布:网络社区是什么意思 编辑:程序博客网 时间:2024/04/30 19:09
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

0 0
原创粉丝点击