Java存儲(chǔ)過程調(diào)用CallableStatement的方法
什么是存儲(chǔ)過程?
一個(gè)存儲(chǔ)過程是一個(gè)可編程的函數(shù),它在數(shù)據(jù)庫中創(chuàng)建并保存。它可以有SQL語句和一些特殊的控制結(jié)構(gòu)組成。當(dāng)希望在不同的應(yīng)用程序或平臺(tái)上執(zhí)行相同的函數(shù),或者封裝特定功能時(shí),存儲(chǔ)過程是非常有用的。數(shù)據(jù)庫中的存儲(chǔ)過程可以看做是對(duì)編程中面向?qū)ο蠓椒ǖ哪M。它允許控制數(shù)據(jù)的訪問方式。
存儲(chǔ)過程的優(yōu)點(diǎn):
(1).存儲(chǔ)過程增強(qiáng)了SQL語言的功能和靈活性。存儲(chǔ)過程可以用流控制語句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。
(2).存儲(chǔ)過程允許標(biāo)準(zhǔn)組件是編程。存儲(chǔ)過程被創(chuàng)建后,可以在程序中被多次調(diào)用,而不必重新編寫該存儲(chǔ)過程的SQL語句。而且數(shù)據(jù)庫專業(yè)人員可以隨時(shí)對(duì)存儲(chǔ)過程進(jìn)行修改,對(duì)應(yīng)用程序源代碼毫無影響。
(3).存儲(chǔ)過程能實(shí)現(xiàn)較快的執(zhí)行速度。如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲(chǔ)過程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過程是預(yù)編譯的。在首次運(yùn)行一個(gè)存儲(chǔ)過程時(shí)查詢,優(yōu)化器對(duì)其進(jìn)行分析優(yōu)化,并且給出最終被存儲(chǔ)在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的Transaction-SQL語句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,速度相對(duì)要慢一些。
(4).存儲(chǔ)過程能過減少網(wǎng)絡(luò)流量。針對(duì)同一個(gè)數(shù)據(jù)庫對(duì)象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程存儲(chǔ)過程,那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲(chǔ)過程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,從而大大增加了網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載。
(5).存儲(chǔ)過程可被作為一種安全機(jī)制來充分利用。系統(tǒng)管理員通過執(zhí)行某一存儲(chǔ)過程的權(quán)限進(jìn)行限制,能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)的訪問權(quán)限的限制,避免了非授權(quán)用戶對(duì)數(shù)據(jù)的訪問,保證了數(shù)據(jù)的安全。
簡(jiǎn)單案例,創(chuàng)建于調(diào)用
drop procedure if exists pr_add; -- 計(jì)算兩個(gè)數(shù)之和 create procedure pr_add ( a int, b 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 as sum; /*return c;- 不能在 MySQL 存儲(chǔ)過程中使用。return 只能出現(xiàn)在函數(shù)中。*/ end; set @a = 10; set @b = 20; call pr_add(@a, @b);
Java 案例
1.存儲(chǔ)過程
CREATE PROCEDURE add_pro(a int,b int,out sum int) BEGIN set sum = a + b; END;
2.調(diào)用
package ch13; import java.sql.*; /** * Created by Jiqing on 2016/12/20. */ public class ConnMySql { public static void main(String[] args) throws Exception { // 1.加載驅(qū)動(dòng) Class.forName("com.mysql.jdbc.Driver"); // try() {} 語法中小括號(hào)中的資源會(huì)自動(dòng)回收 try ( // 2.連接數(shù)據(jù)庫 Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tpshop","root","123456"); CallableStatement cstmt = conn.prepareCall("{call add_pro(?,?,?)}") ) { cstmt.setInt(1,4); cstmt.setInt(2,5); cstmt.registerOutParameter(3,Types.INTEGER); cstmt.execute(); System.out.println("執(zhí)行結(jié)果是:"+cstmt.getInt(3)); } } }
執(zhí)行結(jié)果是:9
以上就是Java存儲(chǔ)過程調(diào)用CallableStatement的方法的詳細(xì)內(nèi)容,更多關(guān)于Java存儲(chǔ)過程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot中restful風(fēng)格請(qǐng)求的使用方法示例
RESTful是一種web軟件風(fēng)格,它不是標(biāo)準(zhǔn)也不是協(xié)議,它不一定要采用,只是一種風(fēng)格,它倡導(dǎo)的是一個(gè)資源定位(url)及資源操作的風(fēng)格,下面這篇文章主要給大家介紹了關(guān)于springboot中restful風(fēng)格請(qǐng)求的使用方法,需要的朋友可以參考下2023-02-02詳解java中面向?qū)ο笤O(shè)計(jì)模式類與類的關(guān)系
這篇文章主要介紹了java面向?qū)ο笤O(shè)計(jì)模式中類與類之間的關(guān)系,下面小編和大家一起來學(xué)習(xí)一下吧2019-05-05Java class文件格式之特殊字符串_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
特殊字符串出現(xiàn)在class文件中的常量池中,本著循序漸進(jìn)和減少跨度的原則, 首先把class文件中的特殊字符串做一個(gè)詳細(xì)的介紹, 然后再回過頭來繼續(xù)講解常量池,對(duì)java class 文件格式相關(guān)知識(shí)感興趣的的朋友一起學(xué)習(xí)吧2017-06-06springBoot service層事務(wù)控制的操作
這篇文章主要介紹了springBoot service層事務(wù)控制的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02