初学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中使用存储过程。
- 初学javaweb,我选择存储过程——MySql存储过程详解
- 初学MYSQL存储过程
- MySql存储过程初学
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- OGNL表达式语言详解
- 传统JDBC以及MyBatis和Hibernate的对比
- VS2010上安装配置ARToolKitPlus
- 数组指针和指针数组的区别
- 【ccf-201409-1】相邻数对
- 初学javaweb,我选择存储过程——MySql存储过程详解
- 【小白学CV】传统特征点检测算法SIFT详细分析
- table 删除内容
- Remove Duplicates from Sorted Array
- Struts2中s标签的用法
- 动态区间第K大(树状数组+主席树)
- [java源码] Java Web 文章管理系统(Jsp+Ajax+JDBC+MySql实现)
- hibernate延迟加载和session关闭问题
- vue和element框架搭配实现导航条跳转,点击按钮跳转页面导航条也跟着变换