首页 > 代码库 > mysql存储过程

mysql存储过程

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

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

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

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

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

1 create procedure update_name(IN name varchar(20), IN id INT)2 begin3 update student4 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中。