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); } }
JAVA解析存储过程获取的对象_java 解析数据的存储过程的相关推荐
- java反射之获取class对象_java反射之获取枚举对象
项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...
- java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)
Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...
- java反射怎么获取结构体_java反射-使用反射获取类的所有信息
在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...
- java什么情况下传入对象_java中传输对象时候的问题(转)
对于同一个socket,如果调用两次就会抛出StreamCorruptedException 如果你使用socket,并通过对象输入/输出流来处理的话,并且已经对某个socket调用了一次getInp ...
- java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...
有必要多看几遍的 关于字符和字节,例如文本文件,XML这些都是用字符流来读取和写入.而如RAR,EXE文件,图片等非文本,则用字节流来读取和写入. 读写对象,传输对象在Java中很常使用,在javaB ...
- python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法
一.selenium的介绍 知识点: 了解 selenium的工作原理 了解 selenium以及chromedriver的安装 掌握 标签对象click点击以及send_keys输入 1. sele ...
- python爬虫获取标签规则_Python爬虫之数据提取-selenium定位获取标签对象并提取数据...
## selenium提取数据 知识点:了解 driver对象的常用属性和方法 掌握 driver对象定位标签元素获取标签对象的方法 掌握 标签对象提取文本和属性值的方法 1. driver对象的常 ...
- java 获取xml 版本号_java解析xml获取对应值
importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.x ...
- java读取 info.plist源码_Java 解析 IPA 文件,读取 Info.plist 信息-Go语言中文社区
在做移动MDM功能的时候,就遇到了这样一个问题,当用户上传IPA文件时,我如何知道这个IPA文件的相关信息呢?IPA文件有一个很重要的文件Info.plist 就类似于Android程序的Manife ...
最新文章
- uscao Spinning Wheels
- [转] SAAS, PAAS, IAAS
- Golang 编程 — Go Micro 微服务框架
- 小甲鱼python课后作业十七_小甲鱼Python第十六讲课后习题--017函数
- 【清单】值得「等待」的12个指示加载状态的 js 库
- 光纤收发器按照网管怎么分类?
- 缓存应用--Memcached分布式缓存简介(二)
- C++实现String类
- 华为杯数学建模2020获奖名单_我校在2020年全国大学生数学建模竞赛中再获佳绩(内附获奖名单)...
- LeetCode 462. 最少移动次数使数组元素相等 II(数学)
- 程序猿过年相亲:你总会遇到一个女孩,她不向你要钱,房子和车....
- C#照片预览,好处是图片不在项目中也可以查看
- ANDROID L——Material Design详解(UI控件)
- 二元函数偏导数公式_二阶偏导数公式详解
- glm-0.9.9.7 + visual studio 2019 + window10下载安装
- peoplesoft查询
- 修改 Windows 10 主题字体
- 给Unity开发者的C#内存管理(第一部分) C# Memory Management for Unity Developers (part 1 of 3)
- 医学自然语言处理(NLP)相关论文汇总之 COLING 2022
- 五个Google Play应用程序的有效ASO优化策略
热门文章
- 字符串的回文子序列个数_计算给定字符串中回文子序列的数量
- 哪个计算机无法做到双屏显示,怎么启用双屏显示设置【图文介绍】
- sed 替换_sed命令批量替换文件内容
- 交际过程的两个基本环节_跨文化交际学概论笔记(二)
- 微信 android兼容性问题怎么解决方案,微信小程序兼容性问题
- 计算机硬件加速怎么开,显卡硬件加速,小编教你电脑怎么开启显卡硬件加速
- mysql手动安装配置,mysql8.0.11 winx64手动安装配置教程
- ruby hash方法_Ruby中带有示例的Hash.values方法
- 如何导出已安装的安卓app为apk包
- Navicat for MySQL工具创建mysql数据库定时器