mybatis调用mysql存储过程(返回参数,单结果集,多结果集)

 更新时间:2022年01月17日 11:05:34   作者:阿瑟与非  
本文主要介绍了mybatis调用mysql存储过程(返回参数,单结果集,多结果集),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、接收一个返回值

使用Map接收返回参数,output参数放在传入的param中

创建表

DROP TABLE IF EXISTS `demo`;
CREATE TABLE `demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of demo
-- ----------------------------
INSERT INTO `demo` VALUES ('1', '测试');

创建存储过程

DROP PROCEDURE IF EXISTS pro;
CREATE PROCEDURE pro (
	IN userId INT,
	OUT userCount INT
)
BEGIN
 
DECLARE user_name VARCHAR (64);
SELECT NAME FROM demo WHERE id = userId INTO user_name;
INSERT INTO demo (NAME) VALUES (user_name);
SELECT COUNT(*) FROM demo INTO userCount;
 
END;

mapper.xml

<select id="procedureTest" parameterMap="pm" statementType="CALLABLE">
        CALL pro(#{userId,mode=IN},#{userCount,mode=OUT,jdbcType=INTEGER});
    </select>
 
    <parameterMap id="pm" type="java.util.Map">
        <parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter>
        <parameter property="userCount" jdbcType="INTEGER" mode="OUT"></parameter>
    </parameterMap>

service

@Override
    public void procedureTest() {
        Map<String, Object> param = new HashMap<>();
        param.put("userId", "1");
        demoMapper.procedureTest(param);
        System.out.println("输出结果是:"+param.get("userCount"));
    }

输出结果

参数名不一定和存储过程一样,只和传参顺有关,使用下图配置同样可以获取结果

System.out.println("输出结果是:"+param.get("userCount_2"));

注意事项:

1、  存储过程的参数和名称无关,只和顺序有关系

2、  存储过程的output参数,只能通过传入的map获取

3、  存储过程返回的结果集可直接用返回的map接收

4、  存储过程的return结果需要使用?=call procName(?,?)的第一个参数接收,需要指定对应的mode为OUT类型

5、  存储过程对应的数据类型为枚举类型,需要使用大写,如VARCHAR

output是在存储过程中的参数的返回值(输出参数),而ReturnValue是存储过程返回的值(使用return关键字),一个存储过程可以有任意多个依靠参数返回的值,但只有一个ReturnValue。

存储过程主要分成三类:

1、返回记录集的存储过程:执行结果是一个记录集,例如,从数据库中检索出符合某一个或几个条件的记录。

2、返回数值得的存储过程(也可称为标量存储过程),其执行完后返回一个值,例如数据库中执行一个有返回值的函数或命令。

3、行为存储过程,用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。

二、接收list结果集

使用list接收

@Override
    public void procedureTest() {
        Map<String, Object> param = new HashMap<>();
        param.put("userId", "1");
        List<?> list = demoMapper.procedureTest(param);
        System.out.println("输出结果是:" + param.get("userCount_2"));
        System.out.println("输出集合:" + list.size());
    }
 <select id="procedureTest" parameterMap="pm" statementType="CALLABLE" resultMap="rm">
        CALL pro(#{userId,mode=IN},#{userCount_2,mode=OUT,jdbcType=INTEGER});
    </select>
 
    <parameterMap id="pm" type="java.util.Map">
        <parameter property="userId" jdbcType="INTEGER" mode="IN"></parameter>
        <parameter property="userCount_2" jdbcType="INTEGER" mode="OUT"></parameter>
    </parameterMap>
 
    <resultMap id="rm" type="com.csstj.srm.entity.procedureTestEntity">
        <result column="id" property="id"></result>
        <result column="name" property="userName"></result>
    </resultMap>

三、返回多个结果集

四、第二种配置也可以

CALL s_generatePlan_new (
#{organizationId, mode=IN,jdbcType=VARCHAR},
#{gradeId, mode=IN,jdbcType=VARCHAR},
#{semesterId, mode=IN,jdbcType=VARCHAR},
#{className, mode=IN,jdbcType=VARCHAR},
#{employeeCode, mode=IN,jdbcType=VARCHAR},
#{courseName, mode=IN,jdbcType=VARCHAR},
#{classroomName, mode=IN,jdbcType=VARCHAR},
#{approverId, mode=IN,jdbcType=VARCHAR},
#{createBy, mode=IN,jdbcType=VARCHAR},
#{total,mode=OUT ,jdbcType=VARCHAR})

到此这篇关于mybatis调用mysql存储过程(返回参数,单结果集,多结果集)的文章就介绍到这了,更多相关mybatis调用mysql存储过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于线程、并发的基本概念(详解)

    基于线程、并发的基本概念(详解)

    下面小编就为大家带来一篇基于线程、并发的基本概念(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Struts2学习教程之Action类如何访问WEB资源

    Struts2学习教程之Action类如何访问WEB资源

    这篇文章主要给大家介绍了关于Struts2学习教程之Action类如何访问WEB资源的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • java中Class.forName方法的作用详解

    java中Class.forName方法的作用详解

    Class.forName(xxx.xx.xx) 返回的是一个类,但Class.forName方法的作用到底是什么終?下面这篇文章就来给大家详细介绍了关于java中Class.forName方法的作用,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06
  • JAVA 生成随机数并根据后台概率灵活生成的实例代码

    JAVA 生成随机数并根据后台概率灵活生成的实例代码

    本篇文章主要介绍了JAVA 生成随机数并根据后台概率灵活生成的实例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • Java Servlet线程中AsyncContext异步处理Http请求

    Java Servlet线程中AsyncContext异步处理Http请求

    这篇文章主要介绍了Java Servlet线程中AsyncContext异步处理Http请求及在业务中应用,AsyncContext是Servlet 3.0使Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该Servlet线程
    2023-03-03
  • 解决javaWEB中前后台中文乱码问题的3种方法

    解决javaWEB中前后台中文乱码问题的3种方法

    这篇文章主要介绍了解决javaWEB中前后台中文乱码问题的3种方法,中文问题一直是很多人难以解决的问题,对这方面感兴趣的朋友可以参考一下
    2015-11-11
  • SpringMVC中@ModelAttribute与@RequestBody的区别及说明

    SpringMVC中@ModelAttribute与@RequestBody的区别及说明

    这篇文章主要介绍了SpringMVC中@ModelAttribute与@RequestBody的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 关于@RequestParam的使用所遇到的404问题

    关于@RequestParam的使用所遇到的404问题

    这篇文章主要介绍了关于@RequestParam的使用所遇到的404问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 详解springboot springsecuroty中的注销和权限控制问题

    详解springboot springsecuroty中的注销和权限控制问题

    这篇文章主要介绍了springboot-springsecuroty 注销和权限控制,账户注销需要在SecurityConfig中加入开启注销功能的代码,权限控制要导入springsecurity和thymeleaf的整合依赖,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-03-03
  • SpringBoot+Redis执行lua脚本的方法步骤

    SpringBoot+Redis执行lua脚本的方法步骤

    这篇文章主要介绍了SpringBoot+Redis执行lua脚本的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论