jdbc存储过程mysql_JDBC对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 EXISTSjdbcprocnoinandout;2 create PROCEDUREjdbcprocnoinandout()3 BEGIN
4 select * fromtest.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 EXISTSjdbcprocallin;2 create PROCEDURE jdbcprocallin(id int, value1 VARCHAR(20))3 BEGIN
4 insert into test.test values(id,value1);5 select * fromtest.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 EXISTSjdbcprocinandout;2 create PROCEDURE jdbcprocinandout(in id VARCHAR(20), out value1 VARCHAR(20))3 BEGIN
4 set value1 = CONCAT('我是:',id);5 selectvalue1;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 EXISTSjdbcprocallout;2 create PROCEDURE jdbcprocallout(out outid VARCHAR(20), out outvalue1 VARCHAR(20))3 BEGIN
4 select * into outid,outvalue1 from test.test limit 1;5 selectoutid,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 packagenet.lily.test;2
3 import java.sql.*;4
5 public classMyConnection {6
7 public staticConnection 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 returnconnection;22 }23
24 public static voidcloseConnection(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_JDBC对MySQL数据库存储过程的调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华夏货币增强基金是什么?收益怎么样
- 下一篇: 腾讯优化考核、人才评估体系:反内卷成为核