JDBC(八)CallableStatement 存儲過程調(diào)用

CallableStatement 和 PreparedStatement用法特別相似,只是CallableStatement 可以用來調(diào)用存儲過程燎猛。

存儲過程簡介調(diào)用簡介

SQL語句需要先編譯然后執(zhí)行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集重绷,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來調(diào)用執(zhí)行它昭卓。

存儲過程是可編程的函數(shù),在數(shù)據(jù)庫中創(chuàng)建并保存葬凳,可以由SQL語句和控制結(jié)構(gòu)組成。當(dāng)想要在不同的應(yīng)用程序或平臺上執(zhí)行相同的函數(shù)火焰,或者封裝特定功能時,存儲過程是非常有用的昌简。數(shù)據(jù)庫中的存儲過程可以看做是對編程中面向?qū)ο蠓椒ǖ哪M,它允許控制數(shù)據(jù)的訪問方式纯赎。

存儲過程的優(yōu)點:

(1). 增強(qiáng)SQL語言的功能和靈活性:存儲過程可以用控制語句編寫,有很強(qiáng)的靈活性犬金,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。

(2). 標(biāo)準(zhǔn)組件式編程:存儲過程被創(chuàng)建后峰伙,可以在程序中被多次調(diào)用,而不必重新編寫該存儲過程的SQL語句该默。而且數(shù)據(jù)庫專業(yè)人員可以隨時對存儲過程進(jìn)行修改,對應(yīng)用程序源代碼毫無影響栓袖。

(3). 較快的執(zhí)行速度:如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲過程要比批處理的執(zhí)行速度快很多裹刮。因為存儲過程是預(yù)編譯的。在首次運(yùn)行一個存儲過程時查詢必指,優(yōu)化器對其進(jìn)行分析優(yōu)化,并且給出最終被存儲在系統(tǒng)表中的執(zhí)行計劃。而批處理的Transaction-SQL語句在每次運(yùn)行時都要進(jìn)行編譯和優(yōu)化霜第,速度相對要慢一些户辞。

(4). 減少網(wǎng)絡(luò)流量:針對同一個數(shù)據(jù)庫對象的操作(如查詢泌类、修改)底燎,如果這一操作所涉及的Transaction-SQL語句被組織進(jìn)存儲過程,那么當(dāng)在客戶計算機(jī)上調(diào)用該存儲過程時双仍,網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,從而大大減少網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載朱沃。

(5). 作為一種安全機(jī)制來充分利用:通過對執(zhí)行某一存儲過程的權(quán)限進(jìn)行限制,能夠?qū)崿F(xiàn)對相應(yīng)的數(shù)據(jù)的訪問權(quán)限的限制逗物,避免了非授權(quán)用戶對數(shù)據(jù)的訪問,保證了數(shù)據(jù)的安全翎卓。

MySQL的存儲過程

存儲過程是數(shù)據(jù)庫的一個重要的功能,MySQL 5.0以前并不支持存儲過程失暴,這使得MySQL在應(yīng)用上大打折扣。好在MySQL 5.0開始支持存儲過程锐帜,這樣即可以大大提高數(shù)據(jù)庫的處理速度,同時也可以提高數(shù)據(jù)庫編程的靈活性缴阎。

1. 創(chuàng)建MySQL存儲過程

DELIMITER //
create procedure findById(IN pid INTEGER)
BEGIN
SELECT * FROM `user` WHERE id= pid;
END //
DELIMITER;

2. 調(diào)用存儲過程

package com.jdbc;

import java.sql.*;

/**
 * Created by Fant.J.
 * 2018/3/5 20:14
 */
public class CallableStatementTest {
    static String url = "jdbc:mysql://localhost:3306/user";
    static String user = "root";
    static String password = "root";

    public static void main(String[] args) {


        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(url, user, password);
            String sql = "CALL findById(?)";
            CallableStatement stmt = connection.prepareCall(sql);
            stmt.setInt(1,27);
            ResultSet resultSet = stmt.executeQuery();
            while (resultSet.next()){
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                String birthday = resultSet.getString("birthday");
                String sex = resultSet.getString("sex");
                String address = resultSet.getString("address");

                System.out.println("  " + username + "  " + birthday + " " + sex
                        + " " + address);
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 Fant.J reUseTest  2017-04-20 男 xxxx

3. 全面科普

通過前面的講解和例子简软,我想你肯定已經(jīng)了解調(diào)用存儲過程到底是個什么東西,但是你肯定也能看到痹升,這例子只是一個特例,所以我在這里把 調(diào)用存儲代碼中的sql做個詳解疼蛾。

存儲過程參數(shù)詳解
  • in:往過程里傳參。 (參考我創(chuàng)建存儲過程中的代碼(IN pid INTEGER))
  • out:往過程外傳參。
  • inout:in and out

相對于oracle數(shù)據(jù)庫來說衍慎,MySQL的存儲過程相對功能較弱转唉,使用較少稳捆。

創(chuàng)建的存儲過程保存在數(shù)據(jù)庫的數(shù)據(jù)字典中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乔夯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子末荐,更是在濱河造成了極大的恐慌,老刑警劉巖甲脏,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剃幌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)负乡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖棘,“玉大人茂腥,你說我怎么就攤上這事∏惺。” “怎么了最岗?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長朝捆。 經(jīng)常有香客問我般渡,道長,這世上最難降的妖魔是什么芙盘? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任驯用,我火速辦了婚禮,結(jié)果婚禮上儒老,老公的妹妹穿的比我還像新娘蝴乔。我一直安慰自己,他們只是感情好驮樊,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布薇正。 她就那樣靜靜地躺著片酝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挖腰。 梳的紋絲不亂的頭發(fā)上雕沿,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音曙聂,去河邊找鬼。 笑死宁脊,一個胖子當(dāng)著我的面吹牛断国,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榆苞,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稳衬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坐漏?” 一聲冷哼從身側(cè)響起薄疚,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赊琳,沒想到半個月后街夭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躏筏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年板丽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趁尼。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡埃碱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酥泞,到底是詐尸還是另有隱情砚殿,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布芝囤,位于F島的核電站似炎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凡人。R本人自食惡果不足惜名党,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挠轴。 院中可真熱鬧,春花似錦耳幢、人聲如沸岸晦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽启上。三九已至邢隧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冈在,已是汗流浹背倒慧。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留包券,地道東北人纫谅。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像溅固,于是被迫代替她去往敵國和親付秕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法侍郭,類相關(guān)的語法询吴,內(nèi)部類的語法,繼承相關(guān)的語法亮元,異常的語法猛计,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 任務(wù)需求:定時執(zhí)行的任務(wù),調(diào)用存儲過程爆捞,進(jìn)行數(shù)據(jù)遷移奉瘤。 存儲過程相關(guān)總結(jié):(存儲過程的創(chuàng)建 不能伴隨有if exi...
    時待吾閱讀 3,080評論 0 4
  • 每個孩子來到世上都有自己的使命,其中之一嵌削,就是幫助父母成為更好的生命毛好。 ——題記 如果要?dú)w納2014暑假的關(guān)鍵詞,...
    錢蓉蓉閱讀 416評論 3 3
  • 他:我就叫小周吧苛秕。 第一次見到他是我初一的時候肌访,我承認(rèn)我有點早熟,那是個寒冬的晚上艇劫,當(dāng)年是有晚自習(xí)的吼驶,學(xué)校外有類似...
    劉佳ALanta閱讀 305評論 2 2
  • 序:一個人的朝圣 畢業(yè)后回老家還是去大城市的問題蟹演,我似乎考慮得比周圍人都早。 先去見見世面吧顷蟀。我想酒请。 于是從大一開...
    Chaplin烏龍山伯爵閱讀 3,113評論 2 2