Mybatis执行存储过程返回结果探讨

文章探讨了在MyBatis中使用SELECT和INSERT标签执行存储过程时的不同行为。当存储过程包含输出参数时,无论使用哪种标签,返回值总是输出参数的值。而当存储过程不使用输出参数,SELECT会返回查询结果,INSERT则返回受影响的行数。在有主键冲突的情况下,存储过程的事务处理也影响了执行结果。
摘要由CSDN通过智能技术生成

1、使用select执行存储过程

存储过程:

ALTER PROCEDURE [dbo].[proc_dev_test]
	@ID INT,
	@NAME varchar(50),
  @iRet int=-1 output
AS

begin tran 
		insert into dev_test(id,name) values(@ID,@NAME)
		IF @@ERROR<> 0 GOTO  ERROR
	
commit  
SET @iRet=9
select 9
RETURN

ERROR:
    SET @iRet=-1
	SELECT -1
	ROLLBACK TRAN 
RETURN

执行方式:

    @Select("exec proc_dev_test #{id} ,#{name}")
    int devProcTest(@Param("id") Integer id,@Param("name") String name);

得到的结果:

成功:

 再次点击 主键冲突 失败:

 更换执行方式:

    @Insert("exec proc_dev_test #{id} ,#{name}")
    int devProcTest(@Param("id") Integer id,@Param("name") String name);

 小结:用output返回参数这样的存储过程执行,不管mybatis 用的Select 还是 INSERT 返回的都是output参数的值

那么我们更换下存储过程:

Create PROCEDURE [dbo].[proc_dev_test2]
	@ID INT,
	@NAME varchar(50)
AS

begin tran 
		insert into dev_test(id,name) values(@ID,@NAME)
		IF @@ERROR<> 0 GOTO  ERROR
	
commit  
select 9
RETURN

ERROR:
 
	SELECT -1
	ROLLBACK TRAN 
RETURN

使用select执行

    @Select("exec proc_dev_test2 #{id} ,#{name}")
    int devProcTest(@Param("id") Integer id,@Param("name") String name);

得到的结果:

 而使用Insert 执行

    @Insert("exec proc_dev_test2 #{id} ,#{name}")
    int devProcTest(@Param("id") Integer id,@Param("name") String name);

得到的结果:

小结:  不用output返回参数这样的存储过程执行,SELECT 结果 返回的是SELECT的值 ,而Insert 执行的结果是受影响的行数 两个返回的是不同的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值