java Servlet+mysql 調用帶有輸入參數和傳回值的預存程序(原創),servletmysql

來源:互聯網
上載者:User

java Servlet+mysql 調用帶有輸入參數和傳回值的預存程序(原創),servletmysql

這個資料訪問的功能,我在.NET+Mysql .NET+Sqlserver  PHP+Mysql上都實現過,並且都發布在了我部落格園裡面,因為我覺得這個功能實在是太重要,會讓你少寫很多SQL語句不說,還能提高程式的執行效率, 今天在JAVA+Mysql上也實現了這個功能下面我貼出代碼,這次我會講詳細點,讓看的朋友能更加清楚它的好處在哪裡。

 

一、封裝的代碼儲存過程序呼叫方法

  關於返回類CallableStatement的解釋: CallableStatement 對象為所有的DBMS 提供了一種以標準形式調用已儲存過程的方法。已儲存過程儲存在資料庫中。對已儲存過程的調用是 CallableStatement對象所含的內容。這種調用是 用一種換碼文法來寫的,有兩種形式:一種形式帶結果參,另一種形式不帶結果參數。結果參數是 一種輸出 (OUT) 參數,是已儲存過程的傳回值。兩種形式都可帶有數量可變的輸入(IN 參數)、 輸出(OUT 參數)或輸入和輸出(INOUT 參數)的參數。問號將用作參數的預留位置。

 

  // 調用帶有輸入參數且有傳回值的預存程序    public static CallableStatement callProcInputAndOutPut(String sql, String[] inparameters) {        try {            conn = getConnection();            cs = conn.prepareCall(sql);            if(inparameters!=null)                for(int i=0;i<inparameters.length;i++)                {                    //if中迴圈的參數是我們,在預存程序需要使用到的參數                     if (i<inparameters.length-1) {                         cs.setObject(i+1, inparameters[i]);                      }                     //else中的參數是我們預存程序執行完畢後返回給我們的值,它會被儲存在CallableStatement這個類裡面,                     //然後我們可以根據傳入參數時所在的位置,這個位置就是傳入的數組參下標+1去取預存程序返回給我們的值                     else {                         cs.registerOutParameter(2, java.sql.Types.VARCHAR);                                             }                                     }                               cs.execute();        }        catch (Exception e) {            e.printStackTrace();            throw new RuntimeException(e.getMessage());        }finally{                   }        return cs;    }

 

二、調用方法的代碼

 /*調用帶output參數的預存程序*/            //下面就是我們組合的參數,其中第一個是預存程序所需參數,第二個""沒有賦值的參數就對應預存程序中的輸出參數,就是我們需要的傳回值             String[] sqlParameter=new String[]{"hellow",""};             //調用預存程序的的字串            String  executString="call outputProcudure(?,?)";            //調用預存程序的的字串  outPutProcudure就是我們的預存程序名稱,然後兩個?表示兩個參數,1是我們參數的參數,第二是我們預存程序處理完後返回的值            CallableStatement  proReturnData=MySqlHepler.callProcInputAndOutPut(executString, sqlParameter);            try {                 //取值 由於帶OUT參數的傳回值在我們預存程序中參數的位置是第二位所以我們 使用GETINT(2),接著我會貼預存程序                int returnValue= proReturnData.getInt(2);                if (returnValue==1) {                     String groupAlertString="傳回值是:"+returnValue+"--->插入成功.";                     out.println(groupAlertString);                }                else                 {                 String groupAlertString="傳回值是:"+returnValue+"--->插入失敗,該使用者名稱已經存在.";                    out.println(groupAlertString);                }                             } catch (SQLException e) {                             e.printStackTrace();            }

 

三:預存程序

 這裡我詳細說下:這個調用的預存程序執行的步驟很簡單,就是傳入一個名稱,然後判斷資料庫中是否有相同名稱的人員,如果有

就返回2(不插入),如果沒就返回1(表示我們以hellow為名稱給資料庫中增加了一條資料),這個步驟如果
是直接寫SQL語句是必須寫兩條的,但是這裡用到了預存程序,就只需要如此簡單一步就處理了...,也許你覺得我這個例子舉得不正確,
也許你還會想,我們可以將這個名稱欄位設定個主鍵啊,不就一個SQL語句就行了嗎,呵呵 不過我這裡說了,我只是舉了這麼一
簡單的例子,SQL操作複雜邏輯的地方太多了。。...也許連帶操作的有10步如果你寫SQL語句就需要10次訪問資料,那麼這時候
你再來看這個例子。你會覺得是多麼的讓你愉快.

下面貼預存程序的圖:

 

三:執行效果

  第一次調用預存程序

第二次調用預存程序

  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.