Mybatis 调用sql server储存过程,有参数,有返回值,得到是个空值

首先是XML 文件










<select id="procTrainPay" parameterMap="testParameterMap" statementType="CALLABLE" > 
    {call PROC_TRAIN_PAY(?,?,?,?,?,?,?,?)} 
 </select> 
sql 语句  sql在sql server里面执行成功 得到自己想要的效果
USE [TE_BASE]

GO
/****** Object: StoredProcedure [dbo].[PROC_TRAIN_PAY] Script Date: 01/30/2015 13:15:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].PROC_TRAIN_PAY , @ISSUE VARCHAR(20), @TRAIN NUMERIC, @EXAM NUMERIC, @Billtrain varchar(20),@Billexam varchar(20), @OP13 varchar(20),@PL VARCHAR(30) out )
--@OT是id @ISSUE 期号 @TRAIN 培训金额@EXAM 考试金额 @Billtrain培训发票号 @Billexam考试发票 @OP13收费人

as
declare @PointerPrev int
declare @PointerCurr int
declare @SUUEECE int --记录成功的多少条
declare @SUM int
declare @OT00 int --学员培训申请表ID
declare @OT08 varchar(100) --学员项目名称
declare @OT02 varchar(20) --学员培训期号
declare @COUNT int --该计划一共有多少学员
declare @OT03 varchar(30) --档案号
declare @OP03 NUMERIC --培训金额
declare @OP09 NUMERIC --考试金额
declare @DATE varchar(10) --获取当前日期

declare @OT031 varchar(20) --记录档案号是否重复
declare @X int --自增数
set @PointerCurr=1 --循环字符串用的
set @SUM=0
set @SUUEECE=0
SET @X=0
BEGIN TRANSACTION
BEGIN
while(@PointerCurr<LEN(@OT))
BEGIN
set @OT08=NULL
set @OT02=NULL
set @OT03=NULL
set @OP03=NULL
set @OP09=NULL
set @OT031=NULL
set @PointerPrev=CHARINDEX('`',@OT,@PointerCurr)
--计算出截取的ID
set @OT00=CAST(SUBSTRING(@OT,@PointerCurr,@PointerPrev-@PointerCurr) as int)
set @PointerCurr=@PointerPrev+1
SELECT @OT08=OT08,@OT02=OT02 FROM OA_STUDENT_TRAIN where OT00=@OT00
if(@ISSUE IS NOT NULL)
BEGIN
SET @OT02=@ISSUE
end
if(@OT08 IS NULL or @OT02 IS NULL)
begin
rollback --事物回滚
SET @PL = 'N'
return
end
--获取这期培训多少人,生产档案号
SELECT @COUNT= COUNT(OT03) FROM OA_STUDENT_TRAIN where ot02 = @OT02 and (OT03 IS NOT NULL or OT03 != '')--查询出已经有学员档案号的学员

            --生出学员档案号
            SET @OT03=@OT02+'000'+@COUNT+@X

            SET @X=@X+1
            --查询次学员的档案号是否重复
            SELECT @OT031=OT03 FROM OA_STUDENT_TRAIN WHERE OT03=@OT03
            if(@OT031 IS NOT NULL)
                begin
                rollback --事物回滚
                print '事物回滚了'
                SET @PL = 'N'
                return 
                end
            --培训期号  档案号 向学员报名里面插入
            declare @sql varchar(MAX)
            SET @sql='update OA_STUDENT_TRAIN set OT02='+@OT02+', OT03='+@OT03+' where OT00='+cast(@OT00 as varchar)
            exec(@sql)
            SET @SUM=@@error+@SUM
            --取出这个作业项目的收费标准
            SELECT @OP03=OS03,@OP09=OS07 FROM OA_FEE_SCALE WHERE OS06=@OT08
            select @DATE=convert(varchar(10),getdate(),120)
            if(@OP09 IS NULL OR @OP03 IS NULL)
                begin 
                rollback --事物回滚
                SET @PL = 'N'
                return 
                end
            --金额
            if(@TRAIN=0 or @TRAIN is NULL)
                begin
                set @OP03=@TRAIN
                end
            if(@EXAM = 0 or @EXAM is NULL )
                begin 
                set @OP09=@EXAM
                end
            --插入学员缴费记录
            insert into OA_STUDENT_PAY(OP01,OP02,OP04,OP03,OP06,OP07,OP09,OP05,OP13)
            values( @OT03,'现金',@DATE,@OP03,@Billtrain,@Billexam,@OP09,@OT08,@OP13)
            SET @SUM=@@error+@SUM   
        END
        if(@SUM>0)
                begin
                rollback--事物回滚
                SET @PL = 'N'
                return 
                end
            else
                begin
                COMMIT --事物提交
                SET @PL ='Y'
                end
            END     
return @SUUEECE 
这个是我的DAO层 
@Transactional
public Map<String,Object>  procTrainPay(Map <String,Object> map){
    return baseMapper.procTrainPay(map);
}

这个是我调用的dao
    Map<String,Object> map= new HashMap<String,Object>();
            map.put("addend1",str[x]+"`" );
            map.put("addend2",studentPay.getOp02() );
            map.put("addend3",studentPay.getOp03() );
            map.put("addend4",studentPay.getOp09() );
            map.put("addend5",studentPay.getOp07() );
            map.put("addend6",studentPay.getOp08() );
            map.put("addend7",user.getSu01() );
            Map <String,Object>mapl=baseService.procTrainPay(map);
            System.out.println(mapl.get("sum"));
    执行的结果是空指针。  mapl得到的是一个空值, procTrainPay方法执行没报错。 这里是我sql返回值写错了?还是我的xml配置写错?

XML 里面还少了

<parameterMap type="java.util.Map" id="testParameterMap"> 
    <parameter property="addend1" jdbcType="VARCHAR"  mode="IN"/> 
    <parameter property="addend2" jdbcType="VARCHAR"  mode="IN"/> 
    <parameter property="addend3" jdbcType="NUMERIC"  mode="IN"/> 
    <parameter property="addend4" jdbcType="NUMERIC"  mode="IN"/> 
    <parameter property="addend5" jdbcType="VARCHAR"  mode="IN"/> 
    <parameter property="addend6" jdbcType="VARCHAR"  mode="IN"/> 
    <parameter property="addend7" jdbcType="VARCHAR"  mode="IN"/>  
    <parameter property="sum" jdbcType="VARCHAR" mode="OUT"/> 
</parameterMap>

Map mapl=baseService.procTrainPay(map);
mapl.put("sum",map.get("sum"));
System.out.println(mapl.get("sum"));

需要将paramterMap改为Map类型,我遇到的问题跟你一样,后来是这么解决的

<select id="aaaaa"
            statementType="CALLABLE"
            parameterType="java.util.Map"
            resultType="java.util.Map">
        exec ***** @aaa = #{a},@bbb = #{b},@ccc= #{c}
</select>