JDBC對MySQL資料庫預存程序的調用

來源:互聯網
上載者:User

標籤:結構   代碼   tab   word   tle   targe   sql資料庫   如何   127.0.0.1   

 一、MySQL資料庫預存程序:

        1、什麼是預存程序

        預存程序(英文:Stored Procedure)是在大型資料庫系統中,為了完成特定功能而編寫的一組的SQL語句集。預存程序經編譯儲存在資料庫中,使用者通過指定預存程序的名字並給出參數(如果該預存程序帶有參數)來執行它。

        2、與一般SQL語句相比,使用預存程序有哪些優點,有哪些缺點

        優點:
        1)、減少了指令碼的執行環節,縮短了擷取資料的時間。預存程序只在建立的時進行編譯,在調用使用的時候直接執行,不需再次編譯;而一般SQL語句每次執行前都需要編譯一次,故效率沒有預存程序高;
        2)、減少網路傳輸量,提高了傳輸速度。預存程序編譯後儲存在資料庫伺服器上,使用的時候只需要指定預存程序的名字並給出參數(如果該預存程序帶有參數)就可以了;而一般SQL語句需要將所執行語句字串傳輸到資料庫伺服器端,相比於預存程序而言向資料庫服務端傳送的字串長度比較大;
        3)、安全性比較高。為預存程序參數賦值只能使用問號傳參的形式(這一點可以通過下面JDBC對mysql資料庫預存程序的調用例子體現出來),這樣可以防止SQL注入式攻擊;一般SQL語句也可以做到防止SQL注入式攻擊,但是並不是必須的。可以將Grant、Deny以及Revoke許可權應用於預存程序,即言可以設定只有某些使用者才具有對指定預存程序的使用權;
        缺點:
        1)、如果在一個程式系統中大量的使用預存程序,當程式交付使用的時候隨著客戶需求的增加會導致資料結構的變化,接著就是預存程序的修改,這樣系統維護就會越來越難並且代價也會越來越大。

        3、怎樣建立預存程序及建立預存程序需要注意的地方

        預存程序的建立格式為:

        create procedure 預存程序名([[IN |OUT |INOUT ] 參數名 資料類形...])
        begin
        預存程序體
        end

        建立預存程序的具體例子見下面JDBC對MySQL資料庫預存程序的調用例子;

        需要注意的地方:見下面JDBC對MySQL資料庫預存程序的調用例子內建立預存程序語句中的注釋;

        二、JDBC對MySQL資料庫預存程序的調用:

        為了更加直觀的介紹JDBC如何?對MySQL資料庫預存程序的調用,這裡直接以例子的形式展示。

        1、沒有任何輸入和輸出參數的預存程序

1 drop PROCEDURE if EXISTS jdbcprocnoinandout;2 create PROCEDURE jdbcprocnoinandout()3 BEGIN4     select * from test.test;5 end;

下面是Java代碼:

1 Connection connectionNoInAndOut = MyConnection.getConnection();2         String jdbcprocNoInAndOut = "{call jdbcprocnoinandout()}";3         CallableStatement csNoInAndOut = connectionNoInAndOut.prepareCall(jdbcprocNoInAndOut);4         csNoInAndOut.execute();5         ResultSet rsNoInAndOut = csNoInAndOut.getResultSet();6         while (rsNoInAndOut.next()) {7             System.out.println("jdbcprocnoinandout:"+rsNoInAndOut.getString("id")+"--------"+rsNoInAndOut.getString("value1"));8         }9         MyConnection.closeConnection(connectionNoInAndOut, csNoInAndOut, rsNoInAndOut);

2、只有兩個輸入參數的預存程序

1 drop PROCEDURE if EXISTS jdbcprocallin;2 create PROCEDURE jdbcprocallin(id int, value1 VARCHAR(20))3 BEGIN4     insert into test.test values(id,value1);5     select * from test.test;6 end;

Java代碼:

 1 Connection connectionAllIn = MyConnection.getConnection(); 2         String jdbcprocAllIn = "{call jdbcprocallin(?,?)}"; 3         CallableStatement csAllIn = connectionAllIn.prepareCall(jdbcprocAllIn); 4         csAllIn.setInt(1, 1); 5         csAllIn.setString(2, "asdf"); 6         csAllIn.execute(); 7         ResultSet rsAllIn = csAllIn.getResultSet(); 8         while (rsAllIn.next()) { 9             System.out.println("jdbcprocallin:"+rsAllIn.getString("id")+"--------"+rsAllIn.getString("value1"));10         }11         MyConnection.closeConnection(connectionAllIn, csAllIn, rsAllIn);

3、一個輸入參數一個輸出參數的預存程序

1 drop PROCEDURE if EXISTS jdbcprocinandout;2 create PROCEDURE jdbcprocinandout(in id VARCHAR(20), out value1 VARCHAR(20))3 BEGIN4     set value1 = CONCAT(‘我是:‘,id);5     select value1;6 end;

Java代碼:

 1 Connection connectionInAndOut = MyConnection.getConnection(); 2         String jdbcprocInAndOut = "{call jdbcprocinandout(?,?)}"; 3         CallableStatement csInAndOut = connectionInAndOut.prepareCall(jdbcprocInAndOut); 4         csInAndOut.setString(1, "123123"); 5         csInAndOut.registerOutParameter(2, Types.VARCHAR); 6         csInAndOut.execute(); 7         ResultSet rsInAndOut = csInAndOut.getResultSet(); 8         while (rsInAndOut.next()) { 9             System.out.println("jdbcprocinandout:"+csInAndOut.getString("value1"));10         }11         MyConnection.closeConnection(connectionInAndOut, csInAndOut, rsInAndOut);

4、兩個輸出參數的預存程序

1 drop PROCEDURE if EXISTS jdbcprocallout;2 create PROCEDURE jdbcprocallout(out outid VARCHAR(20), out outvalue1 VARCHAR(20))3 BEGIN4     select * into outid,outvalue1 from test.test limit 1;5     select outid,outvalue1 ;6 end;

Java代碼:

 1 Connection connectionAllOut = MyConnection.getConnection(); 2         String jdbcprocAllOut = "{call jdbcprocallout(?,?)}"; 3         CallableStatement csAllOut = connectionAllOut.prepareCall(jdbcprocAllOut); 4         csAllOut.registerOutParameter(1, Types.VARCHAR); 5         csAllOut.registerOutParameter(2, Types.VARCHAR); 6         csAllOut.execute(); 7         ResultSet rsAllOut = csAllOut.getResultSet(); 8         while (rsAllOut.next()) { 9             System.out.println("jdbcprocallout:"+csAllOut.getString("outid")+"--------"+csAllOut.getString("outvalue1"));10         }11         MyConnection.closeConnection(connectionAllOut, csAllOut, rsAllOut);

資料庫中調用帶有輸出參數的預存程序寫法,例如剛才兩個帶有輸出參數的

1 call jdbcprocinandout(‘lily‘,@value1);2 call jdbcprocallout(@vid,@vvalue);
-- 輸出參數前面必須帶“@”符號,變數名可以隨便寫一個合法變數都可以。

 

附上MyConnection類

 1 package net.lily.test; 2  3 import java.sql.*; 4  5 public class MyConnection { 6      7     public static Connection getConnection() { 8         Connection connection = null; 9         String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useOldAliasMetadataBehavior=true";10         String user = "root";11         String pwd = "123456";12         String driverName = "com.mysql.jdbc.Driver";13         try {14             Class.forName(driverName);15             connection = DriverManager.getConnection(url, user, pwd);16         } catch (ClassNotFoundException e) {17             e.printStackTrace();18         } catch (SQLException e) {19             e.printStackTrace();20         }21         return connection;22     }23 24     public static void closeConnection(Connection con, PreparedStatement ps, ResultSet rs) {25         if (rs != null) {26             try {27                 rs.close();28             } catch (SQLException e) {29                 e.printStackTrace();30             }31         }32         if (ps != null) {33             try {34                 ps.close();35             } catch (SQLException e) {36                 e.printStackTrace();37             }38         }39         if (con != null) {40             try {41                 con.close();42             } catch (SQLException e) {43                 e.printStackTrace();44             }45         }46     }47 }

 


JDBC對MySQL資料庫預存程序的調用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.