关于用mybatis调用存储过程时的入参和出参的传递方法
一、问题描述
a) 目前调用读的存储过程的接口定义一般是:void ReadDatalogs(Map<String,Object> map);,入参和出参都在这个map里面,这样用起来就很麻烦,我希望的是可以定义成:list<TimeData> ReadDataLogs(int stationId, int deviceId, Date startTime, Date endTime);
二、已经尝试的方法
a) 改变入参的传递方式:
i. 改变入参的传递方式: void ReadDatalogs(int stationId, int deviceId, int dataId, Date startTime, Date endTime, List<TimeData> datas);
ii. 改变映射文件:
<select id="ReadDatalogs" statementType="CALLABLE" parameterType="java.lang.Object">
{call readdatalogs(#{0,mode=IN},#{1,mode=IN},#{2,mode=IN},#{3,mode=IN},#{4,mode=IN}, #{5, mode=OUT,jdbcType=OTHER,javaType=ResultSet, resultMap=LogTimeData})}
</select>
iii. 这种方式,通过Postgresql的调试跟踪,可以发现,入参是传递成功了,但是通过单元测试可以发现,结果集没有返回回来。
b) 调用存储过程的时候使用返回值,既然第一种方法已经可以正确传递入参了,那么剩下的就是如何获取返回值的问题了,通过文章(http://www.faceye.net/search/186828.html)的提醒,可以考虑使用如下方式来接收返回值:
i. 修改mapper接口如下:
List<TimeData> datas ReadDatalogs(int stationId, int deviceId, int dataId, Date startTime, Date endTime);
ii. 修改映射文件如下:
<select id="ReadDatalogs" statementType="CALLABLE" parameterType="java.lang.Object">
{ #{mm, mode=OUT,jdbcType=OTHER,javaType=ResultSet, resultMap=LogTimeData}=call readdatalogs(#{0,mode=IN},#{1,mode=IN},#{2,mode=IN},#{3,mode=IN},#{4,mode=IN})}
</select>
iii. 测试结果也是不行,程序没有报错,但是接收不到结果集。
c) 改用一个对象来作为入参:
i. 定义一个pojo类,如下:
public class DataLogQueryParam {
public DataLogQueryParam() {
// TODO Auto-generated constructor stub
}
public DataLogQueryParam(int stationId, int deviceId, int dataId, Date startTime, Date endTime) {
this.stationId = stationId;
this.deviceId = deviceId;
this.dataId = dataId;
this.startTime = startTime;
this.endTime = endTime;
list = new LinkedList<TimeData>();
}
int stationId;
int deviceId;
int dataId;
Date startTime;
Date endTime;
List<TimeData> list;
…
//geter, setter
}
ii. 修改map接口定义如下:void ReadDatalogs(DataLogQueryParam param);
iii. 修改映射文件如下:
<select id="ReadDatalogs" statementType="CALLABLE" parameterType="com.huajie.persistence.pojo.DataLogQueryParam">
{call readdatalogs(#{stationId,mode=IN},#{deviceId,mode=IN},#{dataId,mode=IN},#{startTime,mode=IN},#{endTime,mode=IN},#{list, mode=OUT,jdbcType=OTHER,javaType=ResultSet, resultMap=LogTimeData})}
</select>
iv. 这种方式可以调用成功,并且结果可以正确的存储到param.list成员中。
三、可能还可以尝试的方法
a) 由于实验的时候比较匆忙,难免出错,所以可以考虑把以上的第一种和第二种方法再尝试一遍。
b) 参考https://m.oschina.net/blog/267432 , https://github.com/miemiedev/mybatis-callable ,自己写一个mybatis的插件,当然,这里的前提是要看懂这个插件的实现
c) 结合mybatis的源码来进行调试,分析可能的问题原因,这个可以等周末有空了再来调整。
四、分析
起始在上面的方法中,我感觉第一种、第二种从语法上来说都应该行得通的,但是实验结果却是又不行。
转载于:https://www.cnblogs.com/strinkbug/p/5237225.html
关于用mybatis调用存储过程时的入参和出参的传递方法相关推荐
- SQL SERVER使用ODBC 驱动建立的链接服务器调用存储过程时参数不能为NULL值
我们知道SQL SERVER建立链接服务器(Linked Server)可以选择的驱动程序非常多,最近发现使用ODBC 的 Microsoft OLE DB 驱动程序建立的链接服务器(Linked S ...
- mybatis调用mysql存储过程_秒会mybatis调用存储过程(MySQL)
一.简介 有的时候,我们不方便自己写SQL,而是只能调用别人提供的存储过程,那如何使用mybatis调用存储过程呢? 二.示例步骤(MySQL) 2.1 准备一张表 DROP TABLE IF EXI ...
- java使用mybatis 调用存储过程返回一个游标结果集
瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:IBM:Linux on System z Red Hat Enterprise Linux 7 版本:6.0,4.5 文档用途 mybat ...
- MyBatis调用存储过程,MyBatis调用函数的使用方法
MyBatis调用存储过程,MyBatis调用函数的使用方法 一.MyBatis 调用存储过程 1.不带参数的 <select id="batchAnalyzeAll" st ...
- mybatis调用存储过程报错The error occurred while setting parameters
最近项目用mybatis调用存储过程,在使用的过程中出现了一个错误:The error may involve com.stockcommission.dao.CommissionMapper.par ...
- Android编程中调用Camera时预览画面有旋转问题的解决方法
本文实例讲述了Android编程中调用Camera时预览画面有旋转问题的解决方法.分享给大家供大家参考,具体如下: 在调用Camera写应用的时候,前后摄像头的情况有时候是不一样的.有时候,明明后摄像 ...
- AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一)
AOP注解@Before.@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一) 问题背景 AOP注解@Before.@AfterReturni ...
- aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...
作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...
- Java基础学习总结(168)——为什么推荐在RPC的接口中入参和出参都不要使用枚举
前言: 为什么推荐在RPC的接口中入参和出参都不要使用枚举.最近,我们的线上环境出现了一个问题,线上代码在执行过程中抛出了一个IllegalArgumentException,分析堆栈后,发现最根本的 ...
- 彻底解决spring mvc XSS漏洞问题(包括json的格式的入参和出参)
目录 一,背景 二,名词解释 三,xss修复的一般处理方法 四.扩展jackson定制自己的objectMapper处理json出入参的转义 五.结语 一,背景 昨天收到公司安全部的一封漏洞邮件,说系 ...
最新文章
- 惊呆了,Spring Boot居然这么耗内存!
- 2020上半年收集到的优质AI文章 – 人工智能概述
- 1051 复数乘法 (15 分)
- 前端学习(2843):UI插件开发
- V210 SPI驱动分析
- 目标检测之YOLO V2 V3
- python学习-- django 2.1.7 ajax 请求 进阶版
- 超大ISO文件的分卷刻录方法
- 在Lotus Notes设置邮件转发
- 在Word中如何进行半行输入
- xshell 输入w 命令后报错 66 column window is too narrow
- ORL 人脸库 BP神经网络人脸识别
- BC26接入电信云平台流程
- Windows Server2012 服务器修改密码过期时间
- ros自己写避障算法_基于ROS的机器人室内环境探索、避障和目标跟踪方法与流程...
- qPCR检测基因表达的引物数据库
- seo日常工作表_seo专员日常工作内容是什么?
- 网络类型之BMA与NBMA的区别
- 从零构建通讯器--7.1过往总结和心跳包代码实战
- 怀孕也就36-40周足够,而芯片54周交期伤心欲绝了!
热门文章
- express 设置handlebars模板引擎
- yii2 中 controller 向layout 传值
- Nginx双机热备实现方案(双主热备模式)
- Scrcpy - 开源免费在电脑显示手机画面并控制手机的工具 (投屏/录屏/免Root)
- C++11 random库
- Android开发之在不同API上遇见的坑
- 爬虫实例十 爬取百度贴吧小姐姐照片
- python赋值运算符_解释一下python中的赋值运算符
- java文件编译为class文件需要键入什么命令_Day02:Java语言基础-第一个Java程序以及编译与运行机制...
- 前端怎么通过后台来判断已读状态_微前端自检清单