`
leiliang
  • 浏览: 44509 次
社区版块
存档分类
最新评论

call mysql store procedure in ibatis with spring

阅读更多
call mysql store procedure in ibatis with spring

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>


注意点:
    I.parameterMap中定义的参数顺序与procedure中调用的存储过程的参数顺序相同
    II.parameterMap中定义属性的jdbcType,javaType,mode要仔细
    III.procedure中传参用parameterMap,小心用错parameterClass


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");
}

注意:调用带有out参数的存储过程要用insert,如果用queryFor...会卡死在调用处..

3.有参返回结果集存储过程
1).存储过程:
在MySQL 5.0中,游标只能使用在存储过程中.不过,如果你在 SELECT 语句中如果没有打开游标的话,那么结果集会被直接发送给客户端,也可以 SELECT INTO 到变量中
如果你在存储过程或存储函数中执行一条普通的 SELECT 语句,那么结果集会直接返回给客户端.需要使用MySQL 4.1的客户端-服务器协议来支持它,这意味着 - 例如在PHP中,就需要用 mysqli 扩展而非 mysql 扩展才能实现.

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>

我所犯过的错误:围绕着oracle的做法,在存储过程中设置一个out sys_outcursor参数,然后在parameter中设置一个hashmap results接收这个参数....折腾了几个小时...
这里的关键点就在于,把这个存储过程当一个普通的select元素,设置个resultClass来格式化结果集就行了.

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());

分享到:
评论
1 楼 kodfor 2008-11-24  
嗯,以上问题也折腾我N久

相关推荐

Global site tag (gtag.js) - Google Analytics