由于前一段时间公司特别的忙,所以博客就没有继续更新了。现在有点空闲的时间了,想记录下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); 调用
下面是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: 量变引起质变,青春不悔。。。