[b]call mysql store procedure in ibatis with spring[/b]
1.sqlmap文件编写
1)无参存储过程
2)有参存储过程
1)无out参数
2)有out参数
[color=brown]
注意点:
I.parameterMap中定义的参数顺序与procedure中调用的存储过程的参数顺序相同
II.parameterMap中定义属性的jdbcType,javaType,mode要仔细
III.procedure中传参用parameterMap,小心用错parameterClass
[/color]
2.Java中的调用
1)仅带in参数存储过程调用:
2)带有out参数存储过程调用:
[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]
2)sqlMap:
[color=red]我所犯过的错误:围绕着oracle的做法,在存储过程中设置一个out sys_outcursor参数,然后在parameter中设置一个hashmap results接收这个参数....折腾了几个小时...[/color]
[color=brown]这里的关键点就在于,把这个存储过程当一个普通的select元素,设置个resultClass来格式化结果集就行了.[/color]
3 java中调用:
调用就像普通select一样调用
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());