禁止使用存储过程
优质博文:IT-BLOG-CN
灵感来源
什么是存储过程
存储过程Stored Procedure
是指为了完成特定功能的SQL
语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。
存储过程在数据库技术中属于一种服务端编程方式,是一组预编译的SQL
语句集,常用于对数据库进行操作、控制和管理。存储过程通常包括流程控制语句、数据操作语句、变量的定义和赋值、条件判断语句等,可以在执行过程中接受参数输入,并返回查询结果。
不推荐的原因
【1】存储过程的所有逻辑都是在数据库层面,导致代码后续的可维护性下降;
【2】存储过程可能会包含复杂的业务逻辑,会导致数据库的负载增加,影响数据库的性能;
【3】互联网的数据库由数据库部门专门管理和维护,开发任务无法直接访问数据库。当将业务逻辑写在数据库中时,后续对业务进行修改和维护时就需要同步升级存储过程。影响业务逻辑的维护性。
【4】存储过程的本身是比较难以调试和测试的,所有对于后续的维护也不是很方便。
【5】数据库迁移困难:如果需要从一种数据库迁移到另一种数据库(例如从Oracle
迁移到MySQL
),存储过程可能需要重写,这会带来大量的工作量和风险。
【6】管理困难:随着存储过程的增多,管理可能会变得非常混乱,给维护工作带来极大的不便。
【7】分布式场景的问题:在分布式场景下,存储过程可能无法很好地处理数据分片的问题。例如,水平分表的情况下,存储过程可能无法处理所有数据的分析结果。
适合存储的场景
存储过程的特点:
存储过程具有以下几个特点:
【1】封装性: 存储过程是由SQL
语句和控制语句组成的过程,它们被封装在一起,形成了一个独立的对象,这样可以方便客户端应用程序调用。
【2】可重用性: 存储过程可以被多个客户端应用程序重复使用,因为它们是预编译的,可以在多个应用程序之间共享。
【3】可编程性: 存储过程是可编程的,可以由用户通过SQL
语句和控制结构来定义和修改,从而实现对数据库的操作。
【4】安全性: 存储过程是在数据库中创建和保存的,因此可以增加数据库的安全性。只有受权的用户才能调用存储过程,避免了SQL
注入攻击等安全问题。
适合的场景
像银行这类系统,通常会采用商用的数据库Oracle
、DB2
等,应为这些供应商有着完整的解决方案,可以帮助银行规避大量的风险。银行的一些外围业务会使用一些国产的分布式数据库或者 MySQL
这样开源的数据库。
银行是以数据为核心,且早期银行在建设业务的时候,没有好的国产数据库,所以采采购了 Oracle
、DB2
这样有成功经验的的数据库。且每套数据库都有着自己的一套存储过程开发方式,只要掌握了存储过程的开发技巧,对数据的交互过程是没有问题的,对于前端使用go
、java
、c++
才是第二关心得问题。
存储过程的语法
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);
}
相关文章:

禁止使用存储过程
优质博文:IT-BLOG-CN 灵感来源 什么是存储过程 存储过程Stored Procedure是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。 …...

Flink异常:org/apache/hadoop/hive/ql/parse/SemanticException
在flink项目中跑 上面这段代码出现如下这个异常, java.lang.NoClassDefFoundError: org/apache/thrift/TException 加上下面这个依赖后不报错 <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId…...
Java:构造函数与对象
第一章:构造函数揭秘 —— 创造者的第一次触碰 构造函数,顾名思义,是用于创建和初始化对象的特殊方法。它没有返回类型,名字与类名一致。构造函数是对象诞生的第一步,也是最至关重要的一步。让我们通过一个生动的例子…...
Leetcode(经典题)day1
删除有序数组中的重复项|| 80. 删除有序数组中的重复项 II - 力扣(LeetCode) 和之前的删除有序数组中的重复项|相似,这里是要求最多出现两次,所以多加一个变量来记录出现次数即可,整体上还是使用双指针,…...

k8s record 20240710 监控
不是adaptor 是opetator 案例 监控有了,日志搜集呢? 一、kubelet 的小弟 kubelet — 负责维护容器的生命周期,节点和集群其他部分通信 cAdvisor 集成在 Kubernetes 的 kubelet 中,能够自动发现和监控集群中所有的容器。dockers…...

pdf工具
iLovePDF | 为PDF爱好者提供的PDF文件在线处理工具 https://www.ilovepdf.com/zh-cn 图片 pdf 合并成一个pdf也可以拆分...

百度文心4.0 Turbo开放,领跑国内AI大模型赛道!
百度文心4.0 Turbo开放,领跑国内AI大模型赛道! 前言 文心一言大模型 就在7月5日,在2024世界人工智能大会 (WAIC) 上,百度副总裁谢广军宣布文心大模型4.0 Turbo正式向企业客户全面开放!这一举动直接引发了业界的关注。那…...
Vue3 defineProps的使用
1.什么是defineProps defineProps是Vue3中的一种新的组件数据传递方式,可以用于在子组件中定义接收哪些父组件的props。当父组件的props发生变化时,子组件也会随之响应。 2.如何使用defineProps? 在子组件中可以使用defineProps声明该组件…...
面向对象进阶基础练习
Java学习笔记(新手纯小白向) 第一章 JAVA基础概念 第二章 JAVA安装和环境配置 第三章 IntelliJ IDEA安装 第四章 运算符 第五章 运算符联系 第六章 判断与循环 第七章 判断与循环练习 第八章 循环高级综合 第九章 数组介绍及其内存图 第十章 数…...

iPhone删除所有照片的高效三部曲
苹果手机用久了,系统缓存包括自己使用手机留下的内存肯定会越来越多。其中,相册中的照片数量可能会急剧增加,占据大量的存储空间。当用户们想要对相册进行彻底清理,实现iPhone删除所有照片时,不妨跟随以下详细的三部曲…...
OceanBase 配置项系统变量实现及应用详解(2):系统变量的定义及使用场景
在上一篇博客,配置项的定义及使用方法,详细阐述了配置项的概念及其基本应用方式,这些配置项能够调控集群或租户的行为方式。然而,在实际使用OceanBase的过程中,我们有时仅希望针对当前会话调整某些行为特性,…...

本地部署,去除动漫图像背景Anime Remove Background
目录 摘要 引言 深度学习在动漫角色中的应用 1.U-Net 2.Mask R-CNN 3.ISNet 模型 4.MODNet 模型 5.InSPyReNet 模型 本地部署 运行效果 测验结果 Tip: 摘要 动漫图像背景去除是一项在图像处理和计算机视觉领域具有重要应用的技术,广泛应用于…...
wireshark与tcpdump使用
wireshark 协议层过滤指令ipip.addr 1.1.1.1ip.src 1.1.1.1ip.dst 1.1.1.1tcptcp.port 80tcp.srcport 80tcp.dstport 80tcp.len > 0tcp.flags.fin 1...

【密码学】密码学中的四种攻击方式和两种攻击手段
在密码学中,攻击方式通常指的是密码分析者试图破解加密信息或绕过安全机制的各种策略。根据密码分析者对明文、密文以及加密算法的知识程度,攻击可以分为以下四种基本类型: 一、四种攻击的定义 (1)唯密文攻击(COA, C…...

网络层的角色与重要性:互联网通信的关键
本章讨论网络层及网络互连问题,也就是讨论多个网络通过路由器互连成为一个互连网络的各种问题。在介绍网络层提供的两种不同服务后,我们开始讲解本章的核心内容——网际协议(IP),这是本书的一项重点内容。只有较深入地…...
Transformer模型:WordEmbedding实现
前言 最近在学Transformer,学了理论的部分之后就开始学代码的实现,这里是跟着b站的up主的视频记的笔记,视频链接:19、Transformer模型Encoder原理精讲及其PyTorch逐行实现_哔哩哔哩_bilibili 正文 首先导入所需要的包:…...

如何压缩pdf文件大小,怎么压缩pdf文件大小
在数字化时代,pdf文件因其稳定的格式和跨平台兼容性,成为了工作与学习中不可或缺的一部分。然而,随着pdf文件内容的丰富,pdf文件的体积也随之增大,给传输和存储带来了不少挑战。本文将深入探讨如何高效压缩pdf文件大小…...
Spring Boot集成Atomix快速入门Demo
1.什么是Atomix? Atomix是一个能用的Java框架,用来构建高可用的分布式系统。它是基于RAFT协议的实现,为用户提供了各种原子数据结构,比如map/set/integer等,这些数据结构都可以在整个集群中共享并保证一致性ÿ…...
Go语言map并发安全,互斥锁和读写锁谁更优?
并发编程是 Go 语言的一大特色,合理地使用锁对于保证数据一致性和提高程序性能至关重要。 在处理并发控制时,sync.Mutex(互斥锁)和 sync.RWMutex(读写锁)是两个常用的工具。理解它们各自的优劣及擅长的场景…...

Java多线程性能调优
Synchronized同步锁优化方法 1.6之前比较重量级,1.6后经过优化性能大大提升 使用Synchronized实现同步锁住要是两种方式:方法、代码块。 1.代码块 Synchronized在修饰同步代码块时,是由 monitorenter和monitorexit指令来实现同步的。进入mo…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...