初学javaweb,我选择存储过程——MySql存储过程详解

来源:互联网 发布:c语言简单游戏程序代码 编辑:程序博客网 时间:2024/06/14 22:19

存储过程的主要优点

    1.性能提高。存储过程在创建时,数据库已经对其进行了一次解析和优化,而后每次调用都不会再次编译,这相对于传统的SQL语句中每次调用都需要编译的情况来说,性能有所提高。    2.重用性强。存储过程使用名字即可执行,也就是传说中的“一次编写,随便调用”。    3.减少网络流量。小数据量的时候体现并不明显。存储过程直接在数据库服务器上跑,所有的数据访问都是在服务器内部进行,不需要传输数据到其他终端,因此减少了应用服务器同数据库服务器的通信频率。    4.安全性高。存储过程是通过向用户授予权限(而不是基于表),它们可以提供对特定数据的访问,而且参数化的存储过程可以防止SQL注入,在一定程度上保证了安全性。    5.灵活性增强。存储过程可以使用流程控制语句来编写,可以根据实际情况执行不同的SQL语句,而不是只能单纯地简单地执行命令。    6.减少工作量。    7.可维护性高。生产环境可以通过直接以修改存储过程的方式修改业务逻辑(或bug)而不用重启服务器。

存储过程的主要缺点

    1.编写调试麻烦    2.性能优势不明显    3.赘余功能。    4.可移植性差    5.拓展性差

凡事利弊兼有,这里作者只是简单列出了存储过程的优缺点,希望对存储过程有一个更加清晰的认识的读者,可以自行参考官方的文档和其他权威的资料。在实际的应用开发中,也应该参照实际的情况来选择是否应该使用存储过程。下面作者直接贴出之前写过的一个登陆的存储过程的例子,来介绍一点存储过程的基本语法。并且还会在后续的文章中继续分享存储过程在javaweb项目中的具体使用。

DELIMITER $$--只是一个简单的标识符DROP PROCEDURE IF EXISTS login_pro $$ 如果原有存储过程存在,删掉CREATE PROCEDURE login_pro(IN p_email VARCHAR(50), --创建一个名字为login_pro的存储过程        IN p_password VARCHAR(50),   --形式参数IN表示输入类型的参数;out 表示输出类型的参数;                       OUT out_code INT,            --INOUT 表示输入输出参数 参数名后面需要指定参数类型        OUT out_message VARCHAR(20),        OUT out_userId INT,        OUT out_nickname VARCHAR(16),        OUT out_admin TINYINT)BEGIN --开始        DECLARE uuid VARCHAR(50) DEFAULT ''; --此处声明一个局部变量,默认值'',类型varchar(50)        SELECT `user`.salt INTO uuid FROM `user`  -- 根据登录邮箱,查出对应用户的salt(uuid)        where `user`.`status` = 2 and `user`.email = p_email ;-- select salt into uuid ...给变量uuid赋值        SELECT user_id , nickname, admin --从数据库中查找数据,给三个输出参数赋值        INTO out_userId,out_nickname,out_admin         From `user`         WHERE `user`.`status` = 2         and `user`.email = p_email         and MD5(CONCAT(uuid,p_password)) = `user`.`password`;        IF EXISTS(SELECT * FROM `user` WHERE `user`.`status` = 2 and `user`.email = p_email) THEN   -- 用户名密码匹配,存储过程输出信息 set 变量名 = 值;给一个变量赋值            IF  out_userId >0 THEN  -- if then ... else ... end if;流程控制语句            SET out_code = 300;            SET out_message ='登录成功!';            ELSE            SET out_code = 301;            SET out_message ='登录失败,邮箱和密码不匹配!';            END IF;        ELSE            SET out_code = 302;            SET out_message = '此邮箱还未注册!';        END IF;END $$ --结束DELIMITER; --标识符

执行存储过程:
CALL login_pro(‘2326130720@qq.com’,’123456’,@out_code,@out_message,@id,@name1,@admin);
SELECT @out_code,@out_message,@id,@name1,@admin;

结果:
这里写图片描述

小结一下

DROP PROCEDURE IF EXISTS login_pro –删除一个存在的存储过程

CREATE PROCEDURE login_pro –创建一个存储过程

begin –存储过程的开始

DECLARE 变量名 变量类型 (DEFAULT)–声明局部变量

set 变量名 = 值; –给一个变量赋值
参数:
IN: 参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT: 该值可在存储过程内部被改变,并可返回
INOUT:调用时指定,并且可被改变和返回

条件查询:
IF 条件 THEN 语句; ELSEIF 条件 THEN 语句;ELSE 语句;END IF;
CASE-WHEN-THEN-ELSE语句

CASE-WHEN-THEN-ELSE语句

DELIMITER //  CREATE PROCEDURE proc4 (IN parameter INT)    BEGIN      DECLARE var INT;      SET var=parameter+1;      CASE var        WHEN 0 THEN          INSERT INTO t VALUES (17);        WHEN 1 THEN          INSERT INTO t VALUES (18);        ELSE          INSERT INTO t VALUES (19);      END CASE ;    END ;  //DELIMITER ;

循环语句
WHILE-DO…END-WHILE

DELIMITER //  CREATE PROCEDURE proc5()    BEGIN      DECLARE var INT;      SET var=0;      WHILE var<6 DO        INSERT INTO t VALUES (var);        SET var=var+1;      END WHILE ;    END;  //DELIMITER ;

有存储过程的更详细的操作,可以查看官方文档。下篇博文,将会给大家介绍,Spring中使用存储过程。

原创粉丝点击