初始版:http://blog.csdn.net/fy_kenny/archive/2008/04/30/2350586.aspx
全部是針對Microsoft SQL Server 2000的Stored Procedure的例子:
參照《iBATIS in Action》書寫:
1. max_in_example<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
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} 不要參數括號
*以上示例測試成功,如有問題和建議歡迎反映。