JAVA解析存储过程获取的对象_java 解析数据的存储过程的
先定義枚舉:
public enum ProcParamType {
IN,OUT
}
調(diào)用存儲(chǔ)過(guò)程的描述
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; //出參數(shù)時(shí)指定sqlType
/**
* 入?yún)?shù)構(gòu)造函數(shù)
* @param index
* @param paramValue
*/
public ProcParam(int index,? Object paramValue) {
super();
this.index = index;
this.paramType = ProcParamType.IN;
this.paramValue = paramValue;
}
/**
* 出參數(shù)構(gòu)造函數(shù)
* @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;
}
}
}
服務(wù)類(lèi):
@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類(lèi)型直接轉(zhuǎn)換成ListOfMap結(jié)構(gòu)
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測(cè)試類(lèi):
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); ??? } }
總結(jié)
以上是生活随笔為你收集整理的JAVA解析存储过程获取的对象_java 解析数据的存储过程的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: css 文字重叠_学习过CSS,那你知道
- 下一篇: dr优先级默认_OSPF中的DR/BDR