当前位置: 首页 > news >正文

禁止使用存储过程

优质博文:IT-BLOG-CN

灵感来源

在这里插入图片描述

什么是存储过程

存储过程Stored Procedure是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。

存储过程在数据库技术中属于一种服务端编程方式,是一组预编译的SQL语句集,常用于对数据库进行操作、控制和管理。存储过程通常包括流程控制语句、数据操作语句、变量的定义和赋值、条件判断语句等,可以在执行过程中接受参数输入,并返回查询结果。

不推荐的原因

【1】存储过程的所有逻辑都是在数据库层面,导致代码后续的可维护性下降;
【2】存储过程可能会包含复杂的业务逻辑,会导致数据库的负载增加,影响数据库的性能;
【3】互联网的数据库由数据库部门专门管理和维护,开发任务无法直接访问数据库。当将业务逻辑写在数据库中时,后续对业务进行修改和维护时就需要同步升级存储过程。影响业务逻辑的维护性。
【4】存储过程的本身是比较难以调试和测试的,所有对于后续的维护也不是很方便。
【5】数据库迁移困难:如果需要从一种数据库迁移到另一种数据库(例如从Oracle迁移到MySQL),存储过程可能需要重写,这会带来大量的工作量和风险。
【6】管理困难:随着存储过程的增多,管理可能会变得非常混乱,给维护工作带来极大的不便。
【7】分布式场景的问题:在分布式场景下,存储过程可能无法很好地处理数据分片的问题。例如,水平分表的情况下,存储过程可能无法处理所有数据的分析结果。

适合存储的场景

存储过程的特点:
存储过程具有以下几个特点:
【1】封装性: 存储过程是由SQL语句和控制语句组成的过程,它们被封装在一起,形成了一个独立的对象,这样可以方便客户端应用程序调用。
【2】可重用性: 存储过程可以被多个客户端应用程序重复使用,因为它们是预编译的,可以在多个应用程序之间共享。
【3】可编程性: 存储过程是可编程的,可以由用户通过SQL语句和控制结构来定义和修改,从而实现对数据库的操作。
【4】安全性: 存储过程是在数据库中创建和保存的,因此可以增加数据库的安全性。只有受权的用户才能调用存储过程,避免了SQL注入攻击等安全问题。

适合的场景

像银行这类系统,通常会采用商用的数据库OracleDB2等,应为这些供应商有着完整的解决方案,可以帮助银行规避大量的风险。银行的一些外围业务会使用一些国产的分布式数据库或者 MySQL这样开源的数据库。

银行是以数据为核心,且早期银行在建设业务的时候,没有好的国产数据库,所以采采购了 OracleDB2这样有成功经验的的数据库。且每套数据库都有着自己的一套存储过程开发方式,只要掌握了存储过程的开发技巧,对数据的交互过程是没有问题的,对于前端使用gojavac++才是第二关心得问题。

存储过程的语法

DELIMITER //  #将语句的结束符号从分号;临时改为两个//(可以是自定义)CREATE PROCEDURE CalculateSquare(IN num INT, OUT result INT)  # CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])BEGIN  SET result = num * num;  
END //   DELIMITER ; #将语句的结束符号恢复为分号

【1】DELIMITER用于更改命令结束符,以便在存储过程中使用BEGIN ... END语句。通常,我们使用 //作为新的结束符,并在存储过程定义结束后将其改回;
【2】CREATE PROCEDURE用于创建新的存储过程。
【3】CalculateSquare是存储过程的名称。
【4】(IN num INT, OUT result INT) 定义了输入和输出参数。在这个例子中,num是一个输入参数,result是一个输出参数。
【5】BEGIN ... END之间的部分是存储过程的主体,即要执行的SQL语句。

调用存储过程: 要调用上述存储过程并获取结果,你需要使用CALL语句,并指定一个变量来接收输出参数的值:

SET @input = 5;  
SET @output = 0;  CALL CalculateSquare(@input, @output);  SELECT @output;  -- 输出应该是 25

MyBatis调用存储过程

【1】Mapper.xml文件的使用方式

 <!-- 删除-无参 --><delete id="cleanStored" statementType="CALLABLE">{call bcjs_clean}</delete><!-- 计算-有参 --><select id="implementStorage" statementType="CALLABLE" parameterType="com.meditrusthealth.fast.isip.web.request.actuary.ActuaryVersionReq">{call bcjs_cal(#{projectId},#{userId},#{versionId})}</select>

【2】注解方式

public interface LrMonitorConcentrationMapper extends BaseMapper<LrMonitorConcentration> {@Select({"call setValueIsNotNull(#{format})"})@Options(statementType = StatementType.CALLABLE)void implementStorage(String format);
}	

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • EE trade:限价建仓是什么意思
  • 合合信息“大模型加速器”亮相2024世界人工智能大会
  • PCIe驱动开发(1)— 开发环境搭建
  • 前端面试39(关于git)
  • javaweb学习day1《HTML篇》--新浪微博(前端页面的创建思路及其HTML、css代码详解)
  • 目标检测基本标注工具-labelImg安装与使用
  • aws sap认证考试如何轻松通过
  • 新兴市场游戏产业爆发 传音以技术抢抓机遇 ​
  • 深入解析Pip换源:加速你的Python包管理
  • 山海鲸可视化——天地图画面和热力图
  • Python面试题:在 Python 中,如何连接并操作数据库?
  • 开源项目有哪些机遇与挑战?
  • 老年人在日常生活中可以做哪些简单的伸展运动来缓解身体僵硬?
  • Linux 调试命令记录
  • python压缩PDF方案(Ghostscript+pdfc)
  • Fastjson的基本使用方法大全
  • HTTP中GET与POST的区别 99%的错误认识
  • Java到底能干嘛?
  • k8s如何管理Pod
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue:响应原理
  • Webpack 4x 之路 ( 四 )
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 从零开始在ubuntu上搭建node开发环境
  • 服务器之间,相同帐号,实现免密钥登录
  • 你真的知道 == 和 equals 的区别吗?
  • 前端之Sass/Scss实战笔记
  • 区块链共识机制优缺点对比都是什么
  • 实习面试笔记
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 小试R空间处理新库sf
  • 学习Vue.js的五个小例子
  • #define 用法
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (6)STL算法之转换
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (八十八)VFL语言初步 - 实现布局
  • (补)B+树一些思想
  • (力扣)1314.矩阵区域和
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 常见的偏门问题
  • .net6Api后台+uniapp导出Excel
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net多线程总结
  • .NET企业级应用架构设计系列之结尾篇
  • //解决validator验证插件多个name相同只验证第一的问题
  • /etc/sudoer文件配置简析
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • []指针
  • [145] 二叉树的后序遍历 js