先定义枚举:

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);     } }

JAVA解析存储过程获取的对象_java 解析数据的存储过程的相关推荐

  1. java反射之获取class对象_java反射之获取枚举对象

    项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...

  2. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  3. java反射怎么获取结构体_java反射-使用反射获取类的所有信息

    在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...

  4. java什么情况下传入对象_java中传输对象时候的问题(转)

    对于同一个socket,如果调用两次就会抛出StreamCorruptedException 如果你使用socket,并通过对象输入/输出流来处理的话,并且已经对某个socket调用了一次getInp ...

  5. java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...

    有必要多看几遍的 关于字符和字节,例如文本文件,XML这些都是用字符流来读取和写入.而如RAR,EXE文件,图片等非文本,则用字节流来读取和写入. 读写对象,传输对象在Java中很常使用,在javaB ...

  6. python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法

    一.selenium的介绍 知识点: 了解 selenium的工作原理 了解 selenium以及chromedriver的安装 掌握 标签对象click点击以及send_keys输入 1. sele ...

  7. python爬虫获取标签规则_Python爬虫之数据提取-selenium定位获取标签对象并提取数据...

    ## selenium提取数据 知识点:了解 driver对象的常用属性和方法 掌握 driver对象定位标签元素获取标签对象的方法 掌握 标签对象提取文本和属性值的方法 1. driver对象的常 ...

  8. java 获取xml 版本号_java解析xml获取对应值

    importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.x ...

  9. java读取 info.plist源码_Java 解析 IPA 文件,读取 Info.plist 信息-Go语言中文社区

    在做移动MDM功能的时候,就遇到了这样一个问题,当用户上传IPA文件时,我如何知道这个IPA文件的相关信息呢?IPA文件有一个很重要的文件Info.plist 就类似于Android程序的Manife ...

最新文章

  1. uscao Spinning Wheels
  2. [转] SAAS, PAAS, IAAS
  3. Golang 编程 — Go Micro 微服务框架
  4. 小甲鱼python课后作业十七_小甲鱼Python第十六讲课后习题--017函数
  5. 【清单】值得「等待」的12个指示加载状态的 js 库
  6. 光纤收发器按照网管怎么分类?
  7. 缓存应用--Memcached分布式缓存简介(二)
  8. C++实现String类
  9. 华为杯数学建模2020获奖名单_我校在2020年全国大学生数学建模竞赛中再获佳绩(内附获奖名单)...
  10. LeetCode 462. 最少移动次数使数组元素相等 II(数学)
  11. 程序猿过年相亲:你总会遇到一个女孩,她不向你要钱,房子和车....
  12. C#照片预览,好处是图片不在项目中也可以查看
  13. ANDROID L——Material Design详解(UI控件)
  14. 二元函数偏导数公式_二阶偏导数公式详解
  15. glm-0.9.9.7 + visual studio 2019 + window10下载安装
  16. peoplesoft查询
  17. 修改 Windows 10 主题字体
  18. 给Unity开发者的C#内存管理(第一部分) C# Memory Management for Unity Developers (part 1 of 3)
  19. 医学自然语言处理(NLP)相关论文汇总之 COLING 2022
  20. 五个Google Play应用程序的有效ASO优化策略

热门文章

  1. 字符串的回文子序列个数_计算给定字符串中回文子序列的数量
  2. 哪个计算机无法做到双屏显示,怎么启用双屏显示设置【图文介绍】
  3. sed 替换_sed命令批量替换文件内容
  4. 交际过程的两个基本环节_跨文化交际学概论笔记(二)
  5. 微信 android兼容性问题怎么解决方案,微信小程序兼容性问题
  6. 计算机硬件加速怎么开,显卡硬件加速,小编教你电脑怎么开启显卡硬件加速
  7. mysql手动安装配置,mysql8.0.11 winx64手动安装配置教程
  8. ruby hash方法_Ruby中带有示例的Hash.values方法
  9. 如何导出已安装的安卓app为apk包
  10. Navicat for MySQL工具创建mysql数据库定时器