call mysql store procedure in ibatis with spring

[b]call mysql store procedure in ibatis with spring[/b]

1.sqlmap文件編寫

1)無參存儲過程

<procedure id="testp">
{call test}
</procedure>

2)有參存儲過程
1)無out參數

<parameterMap class="java.util.HashMap" id="roleMap">
<parameter property="userID" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/>
<parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="sex" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/>
<parameter property="icon" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/>
</parameterMap>
<procedure id="insertRole" parameterMap="roleMap">
<![CDATA[
{call insertRole(?,?,?,?)}
]]>
</procedure>

2)有out參數

<parameterMap class="java.util.HashMap" id="userMap_4">
<parameter property="userName" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="number" jdbcType="INT" javaType="java.lang.Integer" mode="OUT"/>
</parameterMap>
<procedure id="checkUserName" parameterMap="userMap_4">
{call checkUserName(?,?)}
</procedure>

[color=brown]
注意點:
I.parameterMap中定義的參數順序與procedure中調用的存儲過程的參數順序相同
II.parameterMap中定義屬性的jdbcType,javaType,mode要仔細
III.procedure中傳參用parameterMap,小心用錯parameterClass
[/color]

2.Java中的調用
1)僅帶in參數存儲過程調用:

Map p = new HashMap();
p.put("userID",new Integer(role.getId()));
p.put("name",role.getName());
p.put("sex", new Integer(role.getSex()));
p.put("icon", new Integer(role.getIcon()));
getSqlMapClientTemplate().queryForObject("insertRole",p);

2)帶有out參數存儲過程調用:

public int checkUserName(String name){
HashMap<String,Object> p=new HashMap<String,Object>();
p.put("userName", name);
p.put("number", null);
getSqlMapClientTemplate().insert("checkUserName", p);
return (Integer)p.get("number");
}

[color=red]注意:調用帶有out參數的存儲過程要用insert,如果用queryFor...會卡死在調用處..[/color]

3.有參返回結果集存儲過程
1).存儲過程:
[color=indigo]在MySQL 5.0中,遊標只能使用在存儲過程中.不過,如果你在 SELECT 語句中如果沒有打開遊標的話,那麼結果集會被直接發送給客戶端,也可以 SELECT INTO 到變量中[/color]
[color=indigo]如果你在存儲過程或存儲函數中執行一條普通的 SELECT 語句,那麼結果集會直接返回給客戶端.需要使用MySQL 4.1的客戶端-服務器協議來支持它,這意味着 - 例如在PHP中,就需要用 mysqli 擴展而非 mysql 擴展才能實現.
[/color]

create procedure getRoleByUserID(in userID int)
label_proc:begin
select * from role where user_id=userID;
end label_proc

2)sqlMap:

<parameterMap class="java.util.HashMap" id="roleMap_1">
<parameter property="userID" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/>
</parameterMap>
<procedure id="getRoleByUserID" parameterMap="roleMap_1" resultClass="role">
<![CDATA[
{call getRoleByUserID(?)}
]]>
</procedure>

[color=red]我所犯過的錯誤:圍繞着oracle的做法,在存儲過程中設置一個out sys_outcursor參數,然後在parameter中設置一個hashmap results接收這個參數....折騰了幾個小時...[/color]
[color=brown]這裏的關鍵點就在於,把這個存儲過程當一個普通的select元素,設置個resultClass來格式化結果集就行了.[/color]

3 java中調用:
調用就像普通select一樣調用

Map p = new HashMap();
p.put("userID", userID);
Role role=(Role)getSqlMapClientTemplate().queryForObject("getRoleByUserID",p);
System.out.println("成功:"+role.getId()+"->"+role.getName());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章