淺談存儲過程

問題引入

面試的時候有時候會問到知不知道存儲過程,用沒用過?

是什么

存儲過程(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…