ibatis与存储过程(带输出参数的存储过程)升级版v1.1

初始版:http://blog.csdn.net/fy_kenny/archive/2008/04/30/2350586.aspx

全部是针对Microsoft SQL Server 2000Stored Procedure的例子:

参照《iBATIS in Action》书写:

1.   max_in_example

Stored Procedure:

 

a.

CREATE PROCEDURE [dbo].[max_in_example]

@a INTEGER = 0 OUTPUT,

@b INTEGER = 0 OUTPUT,

@c INTEGER = 0 OUTPUT

AS

 

BEGIN

       IF (@a > @b)

              SET @c = @a

       ELSE

              SET @c =  @b

       RETURN @c

END

GO

还可以用自定义函数实现:

b.

CREATE FUNCTION max_in_example

(     

       @a INT,

       @b INT

)

RETURNS INT

AS

BEGIN

       DECLARE @c INT

       IF(@a > @b)

              SET @c = @a

       ELSE

              SET @c = @b

 

       RETURN @c

END

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SqlMap:

<parameterMap id="pm_in_example" class="java.util.Map">

       <parameter property="c" javaType="int" jdbcType="INTEGER"

           mode="OUT" />

       <parameter property="a" javaType="int" jdbcType="INTEGER" />

       <parameter property="b" javaType="int" jdbcType="INTEGER" />

 

 

    </parameterMap>

    <procedure id="in_example" parameterMap="pm_in_example"

       resultClass="int">

       { ? = call max_in_example(?, ?) }

    </procedure>

 

Java Code:

public static Integer getMax_in_example(int a, int b) throws SQLException {

    Map<String, Integer> m = new HashMap<String, Integer>(2);

    m.put("a", new Integer(a));

    m.put("b", new Integer(b));

    m.put("c", new Integer(0));

    //执行存储过程in_example

    sqlMapper.queryForObject("in_example", m);

   

    return m.get("c");

}

 

2.   swap

Stored Procedure:

CREATE PROCEDURE [dbo].[swap]

@a INTEGER OUTPUT,

@b INTEGER OUTPUT

 

AS

 

BEGIN

       DECLARE @temp INTEGER

 

       SET @temp = @a

       SET @a = @b

       SET @b = @temp

END

GO

 

SqlMap:

    <parameterMap id="swapProcedureMap" class="java.util.Map">

       <parameter property="a" javaType="int" jdbcType="INTEGER"

           mode="INOUT" />

       <parameter property="b" javaType="int" jdbcType="INTEGER"

           mode="INOUT" />

    </parameterMap>

    <procedure id="swapProcedure" parameterMap="swapProcedureMap">

       { call swap(?, ?) }

    </procedure>

 

Java Code:

public static Map swap(int a, int b) throws SQLException {

    Map<String, Integer> m = new HashMap<String, Integer>(2);

    m.put("a", new Integer(a));

    m.put("b", new Integer(b));

   

    //执行存储过程swap

    sqlMapper.queryForObject("swapProcedure", m);

   

    return m;

}

 

3.   maximum

Stored Procedure:

CREATE PROCEDURE [dbo].[maximum]

@a INT OUTPUT,

@b INT OUTPUT,

@c INT OUTPUT

 

AS

 

BEGIN

    IF(@a > @b)

         SET @c = @a

 

    IF(@b >= @a)

         SET @c = @b

END

GO

 

SqlMap:

<parameterMap id="maxOutProcedureMap" class="java.util.Map">

    <parameter property="a" mode="IN" />

    <parameter property="b" mode="IN" />

    <parameter property="c" jdbcType="INTEGER" mode="OUT" />

</parameterMap>

<procedure id="maxOutProcedure"parameterMap="maxOutProcedureMap">

       { call maximum (?, ?, ?) }

</procedure>

 

Java Code:

public static Integer maximum(int a, int b) throws SQLException {

    Map<String, Integer> m = new HashMap<String, Integer>(2);

    m.put("a", new Integer(a));

    m.put("b", new Integer(b));

    m.put("c", new Integer(0));

   

    //执行存储过程maximum

    sqlMapper.queryForObject("maxOutProcedure", m);

           

    return m.get("c");

}

 

以上的Java Code类方法都是写在相应的ProcedureDAOImpl类中,可以通过ProcedureDAOImpl类调用相应得方法和传入对应参数来与数据库存储过程交互。

 

注意:

1.SqlMap.xml文件中<parameterMap>中参数的顺序跟<Procedure>”?”的顺序一致。

如:a, b, c; ? = procedurename(?, ?) 则,第一个问号表示a,依次类推。

2.存储过程的sql需要注意:在有些时候{ call maximum (?, ?, ?) } 仔细看左大括号后是有一个空格的,这种情况某些时候可以正确运行。但是,我后来使用中发现左大括号后有空格的情况是会发生异常的:Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer] 1 : '{' 附近有语法错误。

经试验右大括号前有空格是没问题的。

建议,大家使用的时候都在左大括号后的空格和右大括号前的空格都去除。你也可以自己多尝试一下。

 

3当存储过程不需要参数时,也可以这样调用{call donothing} 不要参数括号

 

*以上示例测试成功,如有问题和建议欢迎反映。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值