一、提出需求
查询得到男性或女性的数量, 如果传入的是0就女性否则是男性
-- 创建存储过程(查询得到男性或女性的数量, 如果传入的是0就女性否则是男性) DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `p_user_count`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `p_user_count`(IN sex_id INT, OUT user_count INT) BEGIN IF sex_id = 0 THEN SELECT COUNT(*) FROM p_user WHERE p_user.sex = '女' INTO user_count; ELSE SELECT COUNT(*) FROM p_user WHERE p_user.sex = '男' INTO user_count; END IF; END$$ DELIMITER ;
分析:这个存储过程 1个入参, 1个出参
调用的时候,给一个入参,定义一个出参。结果会赋值到出参
调用存储过程
DELIMITER ; SET @user_count = 0; CALL test.p_user_count(0, @user_count); SELECT @user_count;
查询女性的数量,执行结果
二、java 调用
一个入参一个出参,select 里不用定义resultType ,入参和出参都是都是在同一个Map 里
<select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE"> CALL p_user_count(?,?) </select> <parameterMap type="java.util.Map" id="getUserCountMap"> <parameter property="sexid" mode="IN" jdbcType="INTEGER"/> <parameter property="usercount" mode="OUT" jdbcType="INTEGER"/> </parameterMap>
定义接口方法
void getUserCount(Map<String,Integer> params);
调用
/** 测试存储过程 */ @GetMapping("/testcall") @ResponseBody public R testcall() { Map<String, Integer> parameterMap = new HashMap<String, Integer>(); parameterMap.put("sexid", 1); parameterMap.put("usercount", -1); userCallMapper.getUserCount(parameterMap); System.out.println("[result] = " + parameterMap.get("usercount")); return R.ok(); }
获取结果的时候直接从map 里get
######### 测试出错
Parameter number 2 is not an OUT parameter
最终错误是因为存储过程名称写错了,如果名称ok 要确保参数是否是出参
--------------------------- 工程 ---------------------------