mybatis对mysql存储过程的处理

由于前一段时间公司特别的忙,所以博客就没有继续更新了。现在有点空闲的时间了,想记录下mybatis的存储过程的用法.在之前mybatisplus升级到2.14了,他所带来的的特性很强大,可以实现了对象关系型的操作,和hibernate的很相识,他是mybatis的增强版,有兴趣的可以到他官网去逛逛,我之前用过,很爽。现在进入正题,我们都知道,减库存以及加库存是一个同步的过程,一方处理失败就得回滚的过程,所以处理起来要进行各种数据的判断,但这种判断稍有差错就会导致东西买到了,但库存却没有减的尴尬问题,所以为了尽量的减少我们在代码中的处理,这样的业务逻辑,能用存储过程来处理就不用java代码来处理。下面处理代码逻辑

drop procedure if exists jianku;
	 create procedure jianku(id varchar(20), tcount int)
	-- 当存在的时候就将其进行删除掉,重新编译

	BEGIN 
	-- 首先查询是否要减去的库存是否小于或者等于原有数量
-- 开启事物
DECLARE scount int DEFAULT 0;
	     declare resout varchar(50);
				-- 记录执行的返回数是否被执行
		   declare rcount int default 0;
		-- 记录被转的是否存在数据
	declare tocount int default 0;
	START transaction;
       
		   set  @scount=(SELECT count(1) from ku WHERE id=id);
			if (@scount<tcount) THEN
				set @resout="减去的数量不能大于总的数量";
				ELSE
				set @resout="可以进行减库存";
					update ku set number=number-tcount WHERE id=id;
					-- 获取修改执行的返回行数,into 向哪个进行赋值操作,
					select row_count() into rcount;
					if(rcount=0)then 
					-- 说明是没有被成功的执行的,那么就必须要进行回滚操作
					ROLLBACK;
					ELSE
						set @rcount=(SELECT count(1) from jku);
						if(@rcount=0)THEN
							-- 说明是无数据的,那么就是对其进行添加数据
	           insert into jku(id,number)values('1',tcount);
					   select row_count() into rcount;
						   if(@rcount=0)THEN
				       	ROLLBACK;
						    ELSE
					     COMMIT;
	             end if;
					ELSE
				-- set @resout="是到修改数据";
						
	          update jku set number=number+tcount WHERE id='1';
							select row_count() into rcount;-- 执行成功之后,会返回1,根据该值就可以对其进行判断是否插入成功
						 if(@rcount=0)THEN
				       	ROLLBACK;
						    ELSE
					     COMMIT;
								end if;
				end if;
				end if;	
			  end if;	
SELECT @resout;
END;

CALL jianku('1',1);   调用





上面的存储过程看起来有点难,但你仔细阅读,或者查阅mysql的手册以及百度可以理解的.这里就不做过多的解释 
 

下面是mybatis的处理

  <!--用存储过程进行减库存-->
    <select id="jiankucun" statementType="CALLABLE" parameterType="Map">
        call jianku(#{v_seckill_id},#{v_user_phone},#{time},#{resout,jdbcType=INTEGER,mode=OUT})
    </select>
在控制层进行调用
 Map<String,Object>map=new HashMap<String, Object>();
        map.put("v_seckill_id",1000);
        map.put("v_user_phone",321312);
        map.put("time",new Date());
        map.put("resout",null);
        seckillDao.jiankucun(map);
        //{v_user_phone=321312, resout=1, v_seckill_id=1000, time=Sun Oct 22 20:04:55 CST 2017}
        System.out.println(map.get("resout"));//解析返回的resout的值,如果是1,值是减库存成功,其他的怎不成功,事务回滚
        System.out.println(map);
这样就在很少的代码中实现减库存的操作。存储过程很重要,希望能帮助所需之人。

ps: 量变引起质变,青春不悔。。。




猜你喜欢

转载自blog.csdn.net/arryluo123/article/details/78312810