一、问题描述

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/267432https://github.com/miemiedev/mybatis-callable  ,自己写一个mybatis的插件,当然,这里的前提是要看懂这个插件的实现

c)         结合mybatis的源码来进行调试,分析可能的问题原因,这个可以等周末有空了再来调整。

四、分析

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

关于用mybatis调用存储过程时的入参和出参的传递方法的更多相关文章

  1. mybatis调用存储过程,获取返回的游标

    将调用存储过程参数放入map中,由于返回的游标中包含很多参数,所以再写一个resultmap与之对应,类型为hashmap.设置返回的jdbcType=CURSOR,resultMap设置为id对应的 ...

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

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

  3. EF 6 调用存储过程时返回多结果集和OUTPUT参数问题

    原文地址:http://q.cnblogs.com/q/56836/ 各位大侠,提问一个关于EF6调用存储过程时返回多结果集和OUTPUT参数问题 目前已经可以调用存储过程并且可以返回多个结果集. 但 ...

  4. MyBatis基础:MyBatis调用存储过程(6)

    1. 存储过程准备 CREATE PROCEDURE sp_task ( IN userId INT ) BEGIN SELECT * FROM task WHERE user_id = userId ...

  5. 使用mybatis调用存储过程(注解形式和配置文件形式)

    最近在看资料中涉及到mybatis,突然想到mysql中的视图.存储过程.函数.现将在使用mybatis调用mysql的存储过程使用总结下: 使用的环境:mybatis3.4.6,mysql 5.6, ...

  6. mybatis调用存储过程获得取返回值

    总体思路:map传值 controller: Map<String,Object> m=new HashMap<String,Object>(); m.put("na ...

  7. Mybatis调用存储过程报错

    Mybatis调用存储过程 贴码 123456 Error querying database. Cause: java.sql.SQLException: User does not have ac ...

  8. 字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一篇 Helloworld 中,我们初步尝试使用了 Javassist字节编程的 ...

  9. 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法

    [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...

随机推荐

  1. Google Nexus5在linux下刷原生安卓 android6.0

    之前将Nexus5刷成了MIUI系统,现在想体验一下安卓6.0,网上都是windows的教程,但如何在linux下刷机呢? 首先准备环境和工具: 1. 我的linux系统是lubuntu 15.10 ...

  2. Oracle BIEE启停脚本

    作为BI的开发人员,经常启停BI服务在所难免,启动的过程又比较长,命令需要不同目录切换,简直烦死人呢, 特意整理了linux中的启动脚本,将以下脚本存成biee.sh,后面的过程就相当简单了, 启动: ...

  3. Mongodb Manual阅读笔记:MongoDB教程

    Mongodb教程的说明,可以当手册用 Getting Started Install MongoDB on Linux Systems Install MongoDB on Red Hat Ente ...

  4. [20130919]出现有持续性的Lazy Write

    表现:收到性能告警,LazyWrite严重超标,一般在100以上,正常情况下,LazyWrite为0,但是奇怪的是,当时的Free pages =312190左右,相当于2G空闲空间.OS的可用内存在 ...

  5. 简单阐述下Ajax以get方式请求的步骤 初学,不对的话,跟我说下,谢谢!

    首先, 在GET提交中"=,&"等字符与请求字符串的关键字相混淆.所以: 第一步,先对get提交过来的数据进行编码. 第二步,实例化ajax对象. 第三步,创建对服务器的连 ...

  6. OpenResty(nginx+lua) 入门

    OpenResty 官网:http://openresty.org/ OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台.最重要的一点是它将lua/luajit打包了进来, ...

  7. 【转】MySQL 数据库存储引擎

    原文地址:http://blog.jobbole.com/94385/ 简单介绍 存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式.存储引擎的概念是MySQl的特点,而且是一个插入 ...

  8. 烂泥:ubuntu下vsftpd虚拟用户配置

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我微信ilanniweb. 以前搭建vsftpd都是在centos下,本以为在ubuntu按照以前的步骤搭建即可.可 ...

  9. Swift完整项目打包Framework,嵌入OC项目使用

    场景说明: -之前做的App,使用Swift框架语言,混合编程,内涵少部分OC代码. -需要App整体功能打包成静态库,完整移植到另一个App使用,该App使用OC. -所以涉及到一个语言互转的处理, ...

  10. JAVA学习网址收藏

    什么是JDK?http://baike.baidu.com/subview/25214/5047948.htm?fr=aladdin Java经典入门教程(环境说明) http://wenku.bai ...