一、问题描述

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的源码来进行调试,分析可能的问题原因,这个可以等周末有空了再来调整。

四、分析

起始在上面的方法中,我感觉第一种、第二种从语法上来说都应该行得通的,但是实验结果却是又不行。

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/strinkbug/p/5237225.html

关于用mybatis调用存储过程时的入参和出参的传递方法相关推荐

  1. SQL SERVER使用ODBC 驱动建立的链接服务器调用存储过程时参数不能为NULL值

    我们知道SQL SERVER建立链接服务器(Linked Server)可以选择的驱动程序非常多,最近发现使用ODBC 的 Microsoft OLE DB 驱动程序建立的链接服务器(Linked S ...

  2. mybatis调用mysql存储过程_秒会mybatis调用存储过程(MySQL)

    一.简介 有的时候,我们不方便自己写SQL,而是只能调用别人提供的存储过程,那如何使用mybatis调用存储过程呢? 二.示例步骤(MySQL) 2.1 准备一张表 DROP TABLE IF EXI ...

  3. java使用mybatis 调用存储过程返回一个游标结果集

    瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:IBM:Linux on System z Red Hat Enterprise Linux 7 版本:6.0,4.5 文档用途 mybat ...

  4. MyBatis调用存储过程,MyBatis调用函数的使用方法

    MyBatis调用存储过程,MyBatis调用函数的使用方法 一.MyBatis 调用存储过程 1.不带参数的 <select id="batchAnalyzeAll" st ...

  5. mybatis调用存储过程报错The error occurred while setting parameters

    最近项目用mybatis调用存储过程,在使用的过程中出现了一个错误:The error may involve com.stockcommission.dao.CommissionMapper.par ...

  6. Android编程中调用Camera时预览画面有旋转问题的解决方法

    本文实例讲述了Android编程中调用Camera时预览画面有旋转问题的解决方法.分享给大家供大家参考,具体如下: 在调用Camera写应用的时候,前后摄像头的情况有时候是不一样的.有时候,明明后摄像 ...

  7. AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一)

    AOP注解@Before.@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一) 问题背景 AOP注解@Before.@AfterReturni ...

  8. aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...

    作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...

  9. Java基础学习总结(168)——为什么推荐在RPC的接口中入参和出参都不要使用枚举

    前言: 为什么推荐在RPC的接口中入参和出参都不要使用枚举.最近,我们的线上环境出现了一个问题,线上代码在执行过程中抛出了一个IllegalArgumentException,分析堆栈后,发现最根本的 ...

  10. 彻底解决spring mvc XSS漏洞问题(包括json的格式的入参和出参)

    目录 一,背景 二,名词解释 三,xss修复的一般处理方法 四.扩展jackson定制自己的objectMapper处理json出入参的转义 五.结语 一,背景 昨天收到公司安全部的一封漏洞邮件,说系 ...

最新文章

  1. 惊呆了,Spring Boot居然这么耗内存!
  2. 2020上半年收集到的优质AI文章 – 人工智能概述
  3. 1051 复数乘法 (15 分)
  4. 前端学习(2843):UI插件开发
  5. V210 SPI驱动分析
  6. 目标检测之YOLO V2 V3
  7. python学习-- django 2.1.7 ajax 请求 进阶版
  8. 超大ISO文件的分卷刻录方法
  9. 在Lotus Notes设置邮件转发
  10. 在Word中如何进行半行输入
  11. xshell 输入w 命令后报错 66 column window is too narrow
  12. ORL 人脸库 BP神经网络人脸识别
  13. BC26接入电信云平台流程
  14. Windows Server2012 服务器修改密码过期时间
  15. ros自己写避障算法_基于ROS的机器人室内环境探索、避障和目标跟踪方法与流程...
  16. qPCR检测基因表达的引物数据库
  17. seo日常工作表_seo专员日常工作内容是什么?
  18. 网络类型之BMA与NBMA的区别
  19. 从零构建通讯器--7.1过往总结和心跳包代码实战
  20. 怀孕也就36-40周足够,而芯片54周交期伤心欲绝了!

热门文章

  1. express 设置handlebars模板引擎
  2. yii2 中 controller 向layout 传值
  3. Nginx双机热备实现方案(双主热备模式)
  4. Scrcpy - 开源免费在电脑显示手机画面并控制手机的工具 (投屏/录屏/免Root)
  5. C++11 random库
  6. Android开发之在不同API上遇见的坑
  7. 爬虫实例十 爬取百度贴吧小姐姐照片
  8. python赋值运算符_解释一下python中的赋值运算符
  9. java文件编译为class文件需要键入什么命令_Day02:Java语言基础-第一个Java程序以及编译与运行机制...
  10. 前端怎么通过后台来判断已读状态_微前端自检清单