背景:  由于使用了存储过程进行坚转横的动态查询,查询出来的列是不固定的,也就无法使用实体对象自动转换;但关于查询结果返回困扰了很久,网上很多都是将查询结果做为游标 out 输出,但本人试了很多方法,不知道是不是mysql 不支持游标做为输出参数还是什么原因,也没有成功,最终还是把在执行存储过程的时候也就执行了查询结果;然后将结果在Mapper里面配置好返回给java;

首先定义存储过程;

DELIMITER  $$
DROP PROCEDURE if EXISTS `getReport`$$
CREATE PROCEDURE getReport(in $years INT,in $quarter INT)
BEGIN   DECLARE aid int;DECLARE aname VARCHAR(64);DECLARE adate date;DECLARE done INT DEFAULT FALSE;  DECLARE _Cur CURSOR FOR select _id,  _activityName,_date from tb_activity where year(_date) = $years AND quarter(_date )   = $quarter ;-- 将结束标志绑定到游标DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;SET @sqlstr =' SELECT    c.na, c.uid ,c.uname ,';OPEN _Cur; read_loop: LOOPFETCH _Cur INTO aid, aname, adate;  IF done THENLEAVE read_loop;END IF;SET @sqlstr = CONCAT(@sqlstr, 'sum(if( _activityId=',aid,', _cv, 0)),');END LOOP;CLOSE _Cur;
SET @len=LENGTH(@sqlstr) -1;-- select @len;SET @sqlstr = LEFT(@sqlstr ,@len);--  select @sqlstr;-- 此处为sql 拼接 省略-- select @sqlstr;PREPARE s1 from @sqlstr; EXECUTE s1;
DEALLOCATE PREPARE s1;
END $$
DELIMITER ;
CALL getReport(2016,2);

mybatis: userMapper.xml

     <select id="getReport" statementType="CALLABLE" parameterType="java.util.HashMap" resultType="java.util.HashMap">call getReport(#{years,jdbcType=INTEGER,mode=IN},#{quarter,jdbcType=INTEGER,mode=IN})</select>

UserAppMapper,java

public List<Map<String, String>> getReport(HashMap<String, String> map);

@Service
public class UserAppService {

    public List<Map<String,String>> getReport(int year,int quarter){HashMap<String, String> map = new HashMap<String, String>();map.put("years", ""+year);map.put("quarter", ""+quarter);List<Map<String, String>> str =userAppMapper.getReport(map);;System.out.println(str);return str;}

在这个过程中一直困惑我的就是不知道怎样把查询结果输出,以什么对象输入,其实针对不知道能查询出有多少列的结果,都可以使用

 resultType="java.util.HashMap"

而查询当查询结果不只一条时需要 在  java 代码 里面  使用 List 来接收;所以很重要在于  返回值  List<Map<String,String>> ;

当查询出来 的结果多于一条的时候,而我们定义又不是List 就会出现正面异常;

当定义成  public Map<String,String> getYearReport(HashMap<String, String> map); 就会出现如下异常

2017-11-25 09:59:28.130 DEBUG 1132 --- [nio-9090-exec-2] t.m.s.m.UserAppMapper.getYearReport      : <==      Total: 917
2017-11-25 09:59:28.130 DEBUG 1132 --- [nio-9090-exec-2] t.m.s.m.UserAppMapper.getYearReport      : <==    Updates: 0
2017-11-25 09:59:28.132 DEBUG 1132 --- [nio-9090-exec-2] org.mybatis.spring.SqlSessionUtils       : Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@36fd289c]
2017-11-25 09:59:28.132 DEBUG 1132 --- [nio-9090-exec-2] o.s.jdbc.datasource.DataSourceUtils      : Returning JDBC Connection to DataSource
2017-11-25 09:59:28.133 DEBUG 1132 --- [nio-9090-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [public java.util.List<java.util.Map<java.lang.String, java.lang.String>> tk.mybatis.springboot.controller.UserAppController.getYearReport(java.lang.Integer)]: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 917
2017-11-25 09:59:28.134 DEBUG 1132 --- [nio-9090-exec-2] .w.s.m.a.ResponseStatusExceptionResolver : Resolving exception from handler [public java.util.List<java.util.Map<java.lang.String, java.lang.String>> tk.mybatis.springboot.controller.UserAppController.getYearReport(java.lang.Integer)]: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 917
2017-11-25 09:59:28.135 DEBUG 1132 --- [nio-9090-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolving exception from handler [public java.util.List<java.util.Map<java.lang.String, java.lang.String>> tk.mybatis.springboot.controller.UserAppController.getYearReport(java.lang.Integer)]: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 917
2017-11-25 09:59:28.143 DEBUG 1132 --- [nio-9090-exec-2] o.s.web.servlet.DispatcherServlet        : Could not complete requestorg.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 917at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77) ~[mybatis-spring-1.3.1.jar:1.3.1]at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446) ~[mybatis-spring-1.3.1.jar:1.3.1]at com.sun.proxy.$Proxy76.selectOne(Unknown Source) ~[na:na]

当查询出来的数据不能进行匹配的时候,就是定义了错误 的resultType;

A query was run and no Result Maps were found for the Mapped Statement 'user.insertUser!selectKey'. It's likely that neither a Result Type nor a Result Map was specified.

每个人的实现 方法都不一样,只是满足自己需求 就好;

mybatis mysql 关于调用存储过程获取查询结果相关推荐

  1. java JDBC连接MySQL数据库调用存储过程进行查询

    java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...

  2. c efcore.mysql_EF Core在mysql中调用存储过程

    EF Core在mysql中调用存储过程,博主找了很多,然而大多都是EF Core+SqlServer的或者EF Core+Oracle的,并没有正对Mysql的Pomelo驱动的,所以查找了一些资料 ...

  3. mysql 视图调用存储过程_MySQL视图、存储过程

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 什么是视图(视图) 虚拟表 内容类似于真实表,有字段和记录 该视图不以数据库中存储的数据的形式存在 行和列的数据来自 ...

  4. mysql触发器调用存储过程出错_mysql 触发器中调用存储过程

    想要在MYSQL的触发器中调用存储过程,但是IDE提示: 0A000 Not allowed to return a result set from a trigger 触发器代码如下: DELIMI ...

  5. mybatis注解方式调用存储过程

    1.建立存储过程: CREATE DEFINER=`root`@`%` PROCEDURE `p_dmk_fsyx`(v_month VARCHAR(6),v_type VARCHAR(2),OUT ...

  6. SpringMVC与Mybatis集合实现调用存储过程、事务控制

    在SSM框架中经常会用到调用数据库中的存储过程.以及事务控制,下面以保存某单据为例,介绍一下: 1.Oracle中存储过程代码如下(主要逻辑将单据编码自动加1,并将该单据编码返回): CREATE O ...

  7. 创建和调用存储过程:查询Stu数据库中某个同学的选修课程的信息,包括学号,姓名,课程名称,成绩

    CREATE PROCEDURE proc_select--建立存储过程@Sno char(10) output,--输入输出参数@Sname varchar(20) out,--输出参数@Cno c ...

  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的快递预取件查询系统

    项目功能: 本系统分用户前台和管理员后台. 用户前台主要功能有: 首页 物流业务 团队 时效费用查询 我的快递 寄快递 个人中心 管理员后台的功能有: 用户列表管理 快递员管理 省份,城市,区县列表管 ...

  9. mysql 视图调用存储过程,是否可以在视图中调用存储过程?

    A similar question about sql-server has been asked here. I'm wondering if its possible in MySql. edi ...

最新文章

  1. 阿里规范不建议多表join,可这SQL要怎么写啊?
  2. python中常见的双下方法_python中常见的双下方法_python面向对象(5)__特殊双下方法...
  3. Zookeeper知识点详解
  4. mysql做前端_MySQL 还可以这样做
  5. 清明梦超能力者黄YY[树链剖分+扫描线,线段树合并]
  6. 美国能源局投2100万美元加速光伏软成本下降
  7. Memcahce(MC)系列(三)Memcached它PHP转让
  8. 突击计划——求数列之和
  9. mysql5.6跳过密码登录_mysql-配置与使用(跳过原始密码登陆)
  10. abaqus一维固结模拟
  11. Android音频系统学习二:Android音频框架
  12. workman 日志_Workman手册笔记一
  13. 苹果iPhone手机怎么恢复备份?详细iOS备份怎么恢复教程
  14. 哈利波特与死圣中文版
  15. 一对一直播源码开发,如何改善音视频通话过程中的用户体验?
  16. Document.location
  17. RS485通信和Modbus协议
  18. [P1860]新魔法药水
  19. 【空间分析】地理探测器法原理及应用
  20. 电脑老是弹出脱机连接_电脑经常弹出脱机工作窗口,怎么解决?

热门文章

  1. Gradient Descent for one-hidden-layer-function(单隐藏层神经网络的梯度下降)
  2. 用C++解决数学类问题的练习
  3. 【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
  4. 计算机、通信方向学习考证经验分享
  5. IM即时通讯源码 聊天交友APP源码
  6. 基于Java的电影售票网站
  7. 深信服“监控员工跳槽倾向”引争议,律师称未告知员工涉嫌违法
  8. sit是什么环境_测试环境是什么_搭建测试环境要遵循什么原则?
  9. ip-guard控制台远程控制客户端的授权方式有几种?
  10. Centos 7 安装 jq json 插件以及使用方法