mysql 带入参和出参_mybatis结合mysql,调用含有入参和出参的存储过程的方式

本文介绍了如何通过Java和MyBatis两种方式调用名为get_serial_no的存储过程,涉及参数传递、事务处理和序列号递增策略。重点讲解了使用Map和Java Bean作为参数的不同实现,并讨论了存储过程在业务中的序列号生成逻辑。
摘要由CSDN通过智能技术生成

先看看存储过程,存储过程名叫get_serial_no:

BEGIN

DECLARE v_category_code VARCHAR(20);

DECLARE v_serial_no INT(5);

DECLARE v_serial_code VARCHAR(20);

DECLARE v_existsed TINYINT(1);

START TRANSACTION;

SELECT serial_no,serial_code INTO v_serial_no,v_serial_code FROM t_bm_serial_no WHERE category_id = p_category_id FOR UPDATE;

SELECT category_code INTO v_category_code FROM t_bm_group_category WHERE category_id = p_category_id;

IF v_category_code IS NOT NULL THEN

IF v_serial_no IS NULL THEN

SET p_serial_code = CONCAT(v_category_code,'0001');

INSERT INTO t_bm_serial_no

(category_id,serial_no,serial_code,oper_id,oper_time)

VALUES

(p_category_id,1,p_serial_code,p_oper_id,NOW());

ELSE

SET v_existsed = 1;

cal_v_increase: WHILE v_existsed > 0 DO

SET v_serial_no = v_serial_no+1;

SELECT count(check_in_no) INTO v_existsed FROM t_bm_checkin c

WHERE c.DISEASE_CATEGORY_ID = p_category_id

AND c.CHECK_IN_STATUS = '200102'

AND RIGHT(check_in_no,5)+ 0 = v_serial_no;

END WHILE cal_v_increase;

SET p_serial_code = CONCAT(v_category_code,RIGHT(CONCAT('0000',v_serial_no),4));

UPDATE t_bm_serial_no

SET serial_no = v_serial_no,

serial_code = p_serial_code,

oper_id = p_oper_id,

oper_time = NOW()

WHERE category_id = p_category_id;

END IF;

END IF;

COMMIT;

END参数:IN p_category_id varchar(36),IN p_oper_id varchar(36),OUT p_serial_code varchar(20)

第一种实现方式,参数为map:

java实现:

HashMap paramMap = new HashMap();

paramMap.put("diseaseCategoryId",checkin.getDiseaseCategoryId());

paramMap.put("operId", checkin.getOperId());

checkInDAO.getCheckInNoByCheckIn(paramMap);//出参存放于paramMap中

checkin.setCheckInNo(checkin.getCheckInNo());

mybatis中配置实现:

配置paramMap,其中diseaseCategoryId和operId为入参,checkInNo为出参

调用sql语句,statementType为callable表示调用存储过程:

{call get_serial_no(?,?,?)}

第二种实现方式,参数为javabean:

这里javabean名为checkin,checkin中含有diseaseCategoryId、operId和checkInNo三个参数:

checkInDAO.getCheckInNoByCheckIn(checkin);这种方式,在mybatis中就不需要配置返回的结果集,同map方式一样,其中diseaseCategoryId和operId为入参,checkInNo为出参

{call get_serial_no(

#{diseaseCategoryId,jdbcType=VARCHAR,mode=IN},

#{operId,jdbcType=VARCHAR,mode=IN},

#{checkInNo,jdbcType=VARCHAR,mode=OUT}

)}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值