mysql存储过程

数据库的存储过程可以减少程序代码的重复性,使程序更加简洁易懂

最近在学习mysql存储过程中遇到了一些有趣的问题:

1、在写存储过程的时候,存储过程名后面一定要加上括号,就算没有参数也要加,不然就会报错

2、在调用存储过程时,没有参数的存储过程可以加括号也可以不加括号

3、由于mysql是不区分大小写的,这点跟SQL不一样。所以在给存储过程入参起名字的时候不要以列名的小写字母来取,不然就会出现原本是更改或操作一条记录的,结果则修改了整个表

1 create procedure update_name(IN name varchar(20), IN id INT)
2 begin
3 update student
4 set sname=name where ID=id;
5 end

这段代码本应该修改一条记录,结果会把整个表的记录都修改。由于不区分大小写,所以ID=id一直为真。

4、在mybatis程序中调用存储过程的主要代码:

无参的存储过程调用比较简单:

1 <select id="selectAllStudent" statementType="CALLABLE">
2   <![CDATA[  
3     {call selectallstudent()}
4    ]]> 
5   </select>

这里的id一定要与接口中一样。

有参数的存储过程调用有两种方法:

第一种:

xml中:

1 <select id="updateNameById" statementType="CALLABLE">
2  <![CDATA[  
3     {call update_name(#{id},#{name})}
4    ]]> 
5  </select>

dao层接口中:

 1 void updateNameById(@Param("id")int id,@Param("name")String psid); 

参数名必须对应,不要会出现绑定失败的错误。

第二种:

XML中:

 1 <parameterMap type="java.util.HashMap" id="update_name">
 2 <parameter property="id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/> 
 3 <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> 
 4 </parameterMap>
 5 
 6   
 7 <select id="updateNameById" parameterMap="update_name"  statementType="CALLABLE">
 8 <![CDATA[  
 9     {call update_psid(?,?)}
10    ]]> 
11  </select>

dao层接口中:

 1 void updateNameById(MAP<String,Object> map); 

这里的parameterMap的参数名不能为空,不然会出错

5、在调用返回结果集的存储过程时,应该有对应的ResultMap,该参数也不能为空,不然会出现莫名其妙的错误。服务器在启动时不会发现这个错误,但是在测试时会出现

程序中的Mapper之间莫名其妙的不对应,照成原因 是Result Map 没有值 在出现错去的Mapper中。

 

原文地址:https://www.cnblogs.com/John-Lyn/p/3835430.html