存储过程可以一次执行多条语句,处理复杂的业务逻辑,完成一些计算。
这篇博客总结一下mysql中存储过程基本的用法——mysql存储过程开荒。我们从怎么写存储过程和怎么调用两方面来探讨下:
一、mysql中存储过程的用法
注意下面的示例可以在mysql管理工具中(我用的navicat)直接运行,如果要在mysql客户端(dos窗口)需要加 delimiter$$ 分隔符。
首先来看第一个例子:
这个存储过程有两个int类型的输入参数,一个varchar类型的输出参数
在begin和end之前执行数据库操作或是计算,
用declare声明了一个int类型的变量,
后面是一个if 判断,注意后面需要有then 和end if,这才是完整的if判断
select语句进行输出,可以直接用select ‘*’输出,或是用as 添加一个列名
存储过程写好编译无误后,用call调用,这里需要一个输出参数,所以我们定义了一个@p_in变量
<code class="hljs sql">use etoak; drop procedure if exists t1; create procedure t1(in a int,in b int,out d varchar(30)) begin declare c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if; set c = a + b; /* select c as sum;*/ select 's' into d; select d as '哈哈'; -- 输出一列 end; /*调用存储过程*/ set @p_in = 1; call t1(10,1,@p_in);</code>
上面我们使用if then条件判断,下面来看使用case when来完成更多的条件:
<code class="hljs sql"><code class="hljs sql">drop procedure if exists t1; create procedure t1(in a int,in b int,out c varchar(30)) begin declare d int; set d = a+1; case d when 1 then insert into student values(null,'dx',11,now()); when 2 then insert into student values(null,'aa',11,now()); else insert into student values(null,'bb',11,now()); end case; select * from student; end;</code></code>
<code class="hljs sql">再来看两个循环,一个是while do循环,一个是loop循环:
<code class="hljs sql"><code class="hljs sql"><code class="hljs vbnet"> /*使用while do循环*/ create procedure t1() begin declare i int DEFAULT 0; while i<5 DO insert into student(name) values(i); set i=i+1; end while; select * from student; end; /*使用loop循环*/ drop procedure if exists t1; create procedure t1() begin declare i int DEFAULT 0; loop_label:LOOP if i = 3 THEN set i = i + 1; ITERATE loop_label; -- iterate相当于java循环里的continue end if; insert into student values(null,i,i,now()); set i = i + 1; if i >= 5 THEN leave loop_label; end if; end loop; select * from student; end;</code></code></code>
<code class="hljs sql"><code class="hljs vbnet">还有比较常用的模糊查询:
<code class="hljs sql"><code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql">/*模糊查询*/ drop procedure if exists t1; create procedure t1(in a varchar(30),out c varchar(30)) begin declare d int; select * from student where name like concat('%',a,'%'); end;</code></code></code></code>
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql">这个例子中要注意的是使用了concat拼接字符串函数。
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql">二、在java代码中如何调用存储过程
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql">通过上面我们知道可以在mysql客户端里面通过call调用存储过程,那在java代码里面又是如何调用的呢<br>
我们来看下下面的例子,使用jdbc的方式调用带输入输出参数的存储过程:<br>
存储过程为如下,实现简单的加法:
<code class="hljs sql"><code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene">create procedure t1(in a int,in b int,out d int) begin declare c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if; set c = a + b; select c into d; end;</code></code></code></code></code>
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><strong>java中通过jdbc调用:</strong>
<code class="hljs sql"><code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java"> import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import java.sql.Types; public class TestProc { public static void main(String[] args) throws SQLException { TestProc tp = new TestProc(); int a = tp.testPro(5, 6); System.out.println(a); //打印输出值 } //获取数据库连接 private static DBConnection dbConnection=null; static { if (null == dbConnection) { dbConnection = new DBConnection(); } } //执行存储过程的方法 public int testPro(int a,int b) throws SQLException{ Connection conn = null; CallableStatement stmt = null; int out = 0; String sql=""; try { conn = dbConnection.getConnection(); stmt = conn.prepareCall("{call t1(?,?,?) }"); stmt.setInt(1, a); stmt.setInt(2, b); stmt.registerOutParameter(3, Types.INTEGER); stmt.execute(); out = stmt.getInt(3); //这里获取下输出参数 }finally { dbConnection.close(conn); dbConnection.close(stmt); } return out; } } </code></code></code></code></code></code>
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java"><strong>mybatis中存储过程的调用:</strong>
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java">声明接口:
<code class="hljs sql"><code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java"><code class="hljs lasso">public Map proc(Map map);</code></code></code></code></code></code></code>
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java"><code class="hljs lasso">xml:
<select id="proc" parameterType="map" statementType="CALLABLE"> {call t1( #{firstParam,jdbcType=INTEGER,mode=IN}, #{secondParam,jdbcType=INTEGER,mode=IN}, #{outParam,jdbcType=INTEGER,mode=OUT} )} </select>
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java"><code class="hljs lasso"><code class="hljs cs">测试:
<code class="hljs sql"><code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java"><code class="hljs lasso"><code class="hljs cs"><code class="hljs vhdl">Map map = new HashMap(); map.put("firstParam",1); map.put("second", 2); bi.proc(map); System.out.println(map.toString());</code></code></code></code></code></code></code></code></code>
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java"><code class="hljs lasso"><code class="hljs cs"><code class="hljs vhdl"><strong>这里注意一下:</strong><br>
mybatis的入参map里面不需要put输出参数,执行完存储过程之后,会自动把输出参数放到map里面。所以我们的打印结果如下:
<code class="hljs sql"><code class="hljs vbnet"><code class="hljs sql"><code class="hljs oxygene"><code class="hljs java"><code class="hljs lasso"><code class="hljs cs"><code class="hljs vhdl">{second=2, firstParam=1, outParam=1}

在數據庫優化中,應根據查詢需求選擇索引策略:1.當查詢涉及多個列且條件順序固定時,使用複合索引;2.當查詢涉及多個列但條件順序不固定時,使用多個單列索引。複合索引適用於優化多列查詢,單列索引則適合單列查詢。

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

MySQL異步主從復制通過binlog實現數據同步,提升讀性能和高可用性。 1)主服務器記錄變更到binlog;2)從服務器通過I/O線程讀取binlog;3)從服務器的SQL線程應用binlog同步數據。

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL的安裝和基本操作包括:1.下載並安裝MySQL,設置根用戶密碼;2.使用SQL命令創建數據庫和表,如CREATEDATABASE和CREATETABLE;3.執行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.創建索引和存儲過程以優化性能和實現複雜邏輯。通過這些步驟,你可以從零開始構建和管理MySQL數據庫。

InnoDBBufferPool通過將數據和索引頁加載到內存中來提升MySQL數據庫的性能。 1)數據頁加載到BufferPool中,減少磁盤I/O。 2)臟頁被標記並定期刷新到磁盤。 3)LRU算法管理數據頁淘汰。 4)預讀機制提前加載可能需要的數據頁。

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器