JAVA解析存储过程获取的对象_java 解析数据的存储过程的

先定义枚举:

public enum ProcParamType {

IN,OUT

}

调用存储过程的描述

public class ProcCallableDescriptor {

private List procParams = new ArrayList();

public List getProcParams() {

return procParams;

}

public void addProPram(ProcParam param) {

procParams.add(param);

}

public void addInProParam(int index, Object paramValue) {

addProPram(new ProcParam(index, paramValue));

}

public void addOutProParam(int index, int sqlType) {

addProPram(new ProcParam(index, sqlType));

}

public static class ProcParam {

private int index;

private ProcParamType paramType;

private Object paramValue;

private int sqlType; //出参数时指定sqlType

/**

* 入参数构造函数

* @param index

* @param paramValue

*/

public ProcParam(int index,  Object paramValue) {

super();

this.index = index;

this.paramType = ProcParamType.IN;

this.paramValue = paramValue;

}

/**

* 出参数构造函数

* @param index

* @param sqlType

*/

public ProcParam(int index, int sqlType) {

super();

this.index = index;

this.paramType = ProcParamType.OUT;

this.sqlType = sqlType;

}

public int getIndex() {

return index;

}

public void setIndex(int index) {

this.index = index;

}

public ProcParamType getParamType() {

return paramType;

}

public void setParamType(ProcParamType paramType) {

this.paramType = paramType;

}

public Object getParamValue() {

return paramValue;

}

public void setParamValue(Object paramValue) {

this.paramValue = paramValue;

}

public int getSqlType() {

return sqlType;

}

public void setSqlType(int sqlType) {

this.sqlType = sqlType;

}

}

}

服务类:

@Service

public class ProcedureService {

@Autowired

protected SessionFactory sessionFactory;

public Object call(String sqlStatement, ProcCallableDescriptor descriptor) throws Exception {

List outParams = new ArrayList();

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

Connection con = SessionFactoryUtils.getDataSource(sessionFactory).getConnection();

try {

CallableStatement cstmt = con.prepareCall(sqlStatement);

if (ObjectUtils.isNotEmpty(descriptor.getProcParams())) {

for (ProcCallableDescriptor.ProcParam param : descriptor.getProcParams()) {

if (ProcParamType.IN.equals(param.getParamType())) {

cstmt.setObject(param.getIndex(), param.getParamValue());

} else if (ProcParamType.OUT.equals(param.getParamType())) {

cstmt.registerOutParameter(param.getIndex(), param.getSqlType());

}

}

}

cstmt.execute();

if (ObjectUtils.isNotEmpty(descriptor.getProcParams())) {

for (ProcCallableDescriptor.ProcParam param : descriptor.getProcParams()) {

if (ProcParamType.OUT.equals(param.getParamType())) {

Object outObj = cstmt.getObject(param.getIndex());

//如果出参是ResultSet类型直接转换成ListOfMap结构

if (outObj instanceof ResultSet) {

List> listOfMaps = new ArrayList>();

ResultSet rs = (ResultSet) outObj;

while (rs.next()) {

Map row = new LinkedHashMap();

for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {

row.put(rs.getMetaData().getColumnLabel(i).toLowerCase(), rs.getObject(i));

}

listOfMaps.add(row);

}

rs.close();

outParams.add(listOfMaps);

} else {

outParams.add(outObj);

}

}

}

}

cstmt.close();

tx.commit();

} catch (Exception e) {

tx.rollback();

throw e;

} finally {

if(con!=null){

con.close();

}

session.close();

}

int outPramCount = 0;

if (ObjectUtils.isNotEmpty(descriptor.getProcParams())) {

for (ProcCallableDescriptor.ProcParam param : descriptor.getProcParams()) {

if (ProcParamType.OUT.equals(param.getParamType())) {

outPramCount++;

}

}

}

if (outPramCount == 1 && ObjectUtils.isNotEmpty(outParams)) {

return outParams.get(0);

} else {

return outParams;

}

}

}

test测试类:

public class ProcedureServiceTest  extends AbstractTestCase{     @Autowired     private ProcedureService service;     @Test     public void test() throws Exception{         ProcCallableDescriptor desc = new ProcCallableDescriptor();         desc.addInProParam(1, DateUtils.toSqlDate("2012-06-08", "yyyy-MM-dd"));         desc.addInProParam(2, DateUtils.toSqlDate("2012-06-09", "yyyy-MM-dd"));         desc.addOutProParam(3, -10);         Object obj = service.call("{call rp1(?,?,?)} ", desc);         System.out.println(obj);     } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值