问题引入

面试的时候有时候会问到知不知道存储过程,用没用过?

是什么

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。

说白了就是一组sql语句集,中间可能还有一些逻辑操作,那么问题来了,反正就是一组sql语句集,我写多个mapper,service掉多个也能实现啊,为什么要用他?往下看

为什么

即有什么优势

  • 重复利用。   个人理解为 相同逻辑下,另一个系统可以直接调用存储过程而不需要在写代码。因为一个系统我把存储过程的sql分开了,划分成功能更小的mapper更便于我后续开发,更便于我之后的重复利用。
  • 减少网络流量 。  调用的时候只传送存储过程名和参数(参数值,参数进出类型,参数数据类型),减少了传送sql。
  • 安全。  sql存储在存储过程中(数据库),可以防止sql注入
  • 存储过程出问题之后,不需要重启项目。大的项目部署时间花费很长,如果是存储过程中出现了问题,只需要修改存储过程即可。
  • 多个sql可以一次执行,减少链接池的连接  个人理解(感觉这才是用存储最大的优点,好多地方居然没写)

有优势肯定会有劣势,那么看一下有什么劣势 

  • 调试麻烦。在数据库连接工具里面其实都能看过哪一步有错,其实也算不上调试麻烦,只不过人家这样写教材,你就的这样回答。
  • 维护困难。存储过程的语法和sql还有点不一样,据说某讯有一个800多行的存储过程,维护的时候看的人都傻了。
  • 移植问题。
  • 重新编译问题。 因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

什么情况下试用

依据他的优点

  • 需要多次频繁的去和数据库连接,可以交给存储过程,减少和数据库的连接过程浪费的时间
  • 由于其安全性,传统银行的项目,必不可少了
  • sql很长   巨长那种

怎么用

以下会结合mybatis写一个简单的带参数的执行过程。

情景模拟:  有一个用户表,还有一个用户绩效表,为了方便绩效表里存了用户姓名,有一天用户名被修改了,①那么绩效表里的用户名也应该修改(其他关联地方都应该修改),②或者新加用户之后,绩效表里也要新添加用户的姓名和id

这里我们用②来做个简单的存储过程。

数据库中执行下列语句直接形成存储过程

DELIMITER $$
USE `cms`$$
CREATE DEFINER=`root`@`%` PROCEDURE `insert_user`(
IN user_name VARCHAR(45),
IN user_age int (11)
)
BEGIN
INSERT INTO `cms`.`demo` (`user_name`, `user_age`) VALUES (user_name, user_age);
select   @@IDENTITY  from  `cms`.`demo`;
INSERT INTO `cms`.`demo1` (`id`) VALUES (@@IDENTITY);
END$$DELIMITER ;

DELIMITER $$      

--DELIMITER是定界符  和最后的呼应形成一个完整的存储过程   $$也可以用//表示  将语句的结束符号从分号;临时改为两个$$

USE `cms`$$   

--用cms这个库 $$ 上面已经说明这是个一句话说完的标识
CREATE DEFINER=`root`@`%` PROCEDURE `insert_user`(      

--CREATE:创建的关键字  DEFINER=`root`@`%`编译自己给加的不知道什么东西    PROCEDURE:声明是个存储过程  `insert_user`:这个是存储过程的方法名 括号里面为参数
IN user_name VARCHAR(45),                                                     

--IN:输入还是输出的方式,user_name:参数名   VARCHAR(45):参数类型
IN user_age int (11)                                                                       
)
BEGIN                                                         

--开始的标识
INSERT INTO `cms`.`demo` (`user_name`, `user_age`) VALUES (user_name, user_age);               

--这个sql不用多解释了吧,就是传入的名字和年龄存储到demo
select   @@IDENTITY  from  `cms`.`demo`;                                                                                     

--这句话的意思是获取刚才插入到demo表中数据的id  
INSERT INTO `cms`.`demo1` (`id`) VALUES (@@IDENTITY);                                                         

--将刚才获取的id插入到demo1里
END$$                                                         --结束的标识

DELIMITER ;                                      --定界符

实际操作中

写完之后就是mapper.xml了

    <insert id="addUser"  statementType="CALLABLE">{call insert_user(#{demo.userName,mode=IN},#{demo.userAge,mode=IN,jdbcType=INTEGER})}</insert>

调用存储过程的方法用call   另外注意statementType="CALLABLE"标志着这个是执行存储过程。

然后参数传递的时候注明是入还是出和存储过程的方法参数对应上eg:mode=IN ,不是String的要标明类型eg:jdbcType=INTEGER

这仅仅是个简单的存储过程如果遇到复杂的有赋值,判断,循环等等的其他的复杂的逻辑,可以查阅其他资料学一下。

MySQL 存储过程 | 菜鸟教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91196.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91196.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91196.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven optional 功能详解

前言 最近参与了一个项目,使用maven管理依赖.项目拆分了很多模块.然后交个多个团队各自开发.最后在一个项目骨架中,把各自的模块引入进来,一起启动. 后来随着项目的深入.引入的jar包变多.发现 jar包太多,编译太慢, 打包之后的war包非常大.这种情况就可以使用optional来优化什么…

Python基础--Day04--流程控制语句

流程控制语句是计算机编程中用于控制程序执行流程的语句。它们允许根据条件来控制代码的执行顺序和逻辑&#xff0c;从而使程序能够根据不同的情况做出不同的决策。流程控制实现了更复杂和灵活的编程逻辑。 顺序语句 顺序语句是按照编写的顺序依次执行程序中的代码。代码会按照…

【同济大学】双速率自动驾驶架构LeAD:端到端+LLM,CARLA实测93%路线完成率,性能SOTA!

近年来&#xff0c;随着端到端的技术快速发展将自动驾驶带到了一个新高度&#xff0c;并且取得了非常亮眼的成绩。由于感知限制和极端长尾场景下训练数据覆盖不足&#xff0c;模型在高密度复杂交通场景下和不规则交通情况下的处理能力不足&#xff0c;导致在开放道路上大规模部…

github与git新手教程(快速访问github)

0 序言 作为一个开发者&#xff0c;你必须知道github和git是什么&#xff0c;怎么使用。 github是一个存储代码等资源的远程仓库&#xff0c;一个大型项目往往需要很多人共同协作开发&#xff0c;而大家如何协同开发的进度与分工等要求需要有一个统一开放保存代码的平台。git…

Windows环境下安装Python和PyCharm

可以只安装PyCharm吗&#xff1f;不可以&#xff01;&#xff01;&#xff01; 开发Python应用程序需要同时安装Python和PyCharm。Python是一种编程语言&#xff0c;PyCharm是一个专门为Python开发设计的集成开发环境&#xff0c;提供丰富的功能以简化编码过程。 一、前期准备…

Qt 嵌入式系统资源管理

在嵌入式系统中&#xff0c;资源&#xff08;CPU、内存、存储、网络等&#xff09;通常非常有限&#xff0c;因此高效的资源管理对 Qt 应用的稳定性和性能至关重要。本文从内存优化、CPU 调度、存储管理到电源控制&#xff0c;全面解析 Qt 嵌入式系统资源管理的关键技术。 一、…

小杰数据结构(one day)——心若安,便是晴天;心若乱,便是阴天。

1.数据结构计算机存储、组织数据的方式&#xff1b;有特定关系的数据元素集合&#xff1b;研究数据的逻辑结构、物理结构&#xff08;真实存在&#xff09;和对应的算法&#xff1b;新结构仍保持原结构类型&#xff1b;选择更高的运行或存储效率的数据结构。逻辑结构——面向问…

力扣面试150(44/150)

7.30 155. 最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…

Linux实战:从零搭建基于LNMP+NFS+DNS的WordPress博客系统

前言 在数字化时代&#xff0c;拥有一个个人博客是技术爱好者展示成果、分享经验的重要方式。本文将带您从零开始&#xff0c;在Linux环境下通过两台服务器协作&#xff0c;搭建一个功能完整的WordPress博客系统。我们将整合LNMP架构、NFS文件共享和DNS域名解析服务&#xff0c…

Apache Ignite 的对等类加载(Peer Class Loading, P2P Class Loading)机制

这段内容是关于 Apache Ignite 的“对等类加载”&#xff08;Peer Class Loading, P2P Class Loading&#xff09;机制的详细说明。这是 Ignite 为了简化开发而设计的一个非常强大的功能&#xff0c;但同时也存在一些安全和性能上的考量。 下面我将用通俗易懂的语言 结构化解…

预过滤环境光贴图制作教程:第四阶段 - Lambert 无权重预过滤(Stage 3)

在完成高光反射的 GGX 预过滤后,我们还需要处理环境光的漫反射部分。本阶段(Stage 3)将基于 Lambert 分布对环境贴图进行无权重预过滤,生成用于漫反射计算的环境数据。与高光反射的方向性不同,漫反射是光线在粗糙表面的均匀散射,因此需要用更适合均匀分布的 Lambert 模型…

Spring与SpringBoot:从手动挡到自动挡的Java开发进化论

大家好&#xff01;我是程序员良辰&#xff0c;今天我们来聊聊Java开发界的两位"重量级选手"&#xff1a;Spring 和 SpringBoot。它们之间的关系就像手动挡汽车和自动挡汽车——一个给你完全的控制权但操作复杂&#xff0c;一个让你轻松上路但保留了切换手动模式的能…

1.4.Vue 的模板事件

Vue 的模板事件1. 最常见和推荐的做法。将复杂的逻辑封装在 methods 中。<!-- ✅ 正确&#xff1a;调用 methods 中的方法 --> <button click"handleClick">点击我</button>new Vue({methods: {handleClick(event) {// 这里可以写任意语句if (this…

SQLite 子查询详解

SQLite 子查询详解 引言 SQLite 是一种轻量级的数据库&#xff0c;以其简单、易用和跨平台而著称。在数据库查询中&#xff0c;子查询是一个非常重要的概念&#xff0c;它允许我们在查询中使用查询结果。本文将详细讲解 SQLite 中的子查询&#xff0c;包括其定义、用法以及在实…

可以组成网络的服务器 - 华为OD统一考试(JavaScript 题解)

题目描述 在一个机房中,服务器的位置标识在n*m的整数矩阵网格中,1表示单元格上有服务器,0表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网,请你统计机房中最大的局域网包含的服务器个数。 输入描述 第一行输入两个正整数,…

redis,MongoDB等未授权访问靶场复现

redis未授权访问在docker中启动vulhub对应的靶场目录&#xff1a;cd /vulhub-master/redis/4-unacc在kali上安装redis程序进行服务连接安装redis apt-get install redis redis链接 redis-cli -h IP -p 端口输入info可以查看信息接下来我们使用redis-rogue-server来获取命令执行…

设计模式:代理模式 Proxy

目录问题解决方案结构代码代理是一种结构型设计模式&#xff0c;让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许在将请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢&#xff1f; 举个例子&#xff1a; 有这样一…

Linux零基础Shell教学全集(可用于日常查询语句,目录清晰,内容详细)(自学尚硅谷B站shell课程后的万字学习笔记,附课程链接)

此文章为学习了 尚硅谷B站课程 后的学习笔记 【尚硅谷】Shell脚本从入门到实战_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1hW41167NW/?spm_id_from333.337.search-card.all.click&vd_source68e0bbe20c8b1102b59ced40f67db628注意&#xff1a;需要先学Linux基础…

GitLab 中的分支和标签的定义及操作

&#xff08;一&#xff09;GitLab 中的分支和标签的定义及操作 1. 分支&#xff08;Branch&#xff09; 定义&#xff1a; 分支是代码仓库中的独立开发路径&#xff0c;允许你在不影响主线&#xff08;通常是 main 或 master 分支&#xff09;的情况下&#xff0c;进行实验、开…

第2章 cmd命令基础:常用基础命令(3)

Hi~ 我是李小咖&#xff0c;主要从事网络安全技术开发和研究。 本文取自《李小咖网安技术库》&#xff0c;欢迎一起交流学习&#x1fae1;&#xff1a;https://imbyter.com 本节介绍的命令有显示系统信息&#xff08;systeminfo&#xff09;、启动指定程序&#xff08;start&am…