数据库的存储过程可以减少程序代码的重复性,使程序更加简洁易懂
最近在学习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中。