日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

jdbc存储过程mysql_JDBC对MySQL数据库存储过程的调用

發(fā)布時間:2023/12/10 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdbc存储过程mysql_JDBC对MySQL数据库存储过程的调用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、什么是存儲過程

存儲過程(英文:Stored Procedure)是在大型數(shù)據(jù)庫系統(tǒng)中,為了完成特定功能而編寫的一組的SQL語句集。存儲過程經(jīng)編譯存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。

2、與一般SQL語句相比,使用存儲過程有哪些優(yōu)點,有哪些缺點

優(yōu)點:

1)、減少了腳本的執(zhí)行環(huán)節(jié),縮短了獲取數(shù)據(jù)的時間。存儲過程只在創(chuàng)建的時進行編譯,在調用使用的時候直接執(zhí)行,不需再次編譯;而一般SQL語句每次執(zhí)行前都需要編譯一次,故效率沒有存儲過程高;

2)、減少網(wǎng)絡傳輸量,提高了傳輸速度。存儲過程編譯后存儲在數(shù)據(jù)庫服務器上,使用的時候只需要指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))就可以了;而一般SQL語句需要將所執(zhí)行語句字符串傳輸?shù)綌?shù)據(jù)庫服務器端,相比于存儲過程而言向數(shù)據(jù)庫服務端傳送的字符串長度比較大;

3)、安全性比較高。為存儲過程參數(shù)賦值只能使用問號傳參的形式(這一點可以通過下面JDBC對mysql數(shù)據(jù)庫存儲過程的調用例子體現(xiàn)出來),這樣可以防止SQL注入式攻擊;一般SQL語句也可以做到防止SQL注入式攻擊,但是并不是必須的。可以將Grant、Deny以及Revoke權限應用于存儲過程,即言可以設定只有某些用戶才具有對指定存儲過程的使用權;

缺點:

1)、如果在一個程序系統(tǒng)中大量的使用存儲過程,當程序交付使用的時候隨著客戶需求的增加會導致數(shù)據(jù)結構的變化,接著就是存儲過程的修改,這樣系統(tǒng)維護就會越來越難并且代價也會越來越大。

3、怎樣創(chuàng)建存儲過程及創(chuàng)建存儲過程需要注意的地方

存儲過程的創(chuàng)建格式為:

create procedure 存儲過程名([[IN |OUT |INOUT ] 參數(shù)名 數(shù)據(jù)類形...])

begin

存儲過程體

end

創(chuàng)建存儲過程的具體例子見下面JDBC對MySQL數(shù)據(jù)庫存儲過程的調用例子;

需要注意的地方:見下面JDBC對MySQL數(shù)據(jù)庫存儲過程的調用例子內創(chuàng)建存儲過程語句中的注釋;

二、JDBC對MySQL數(shù)據(jù)庫存儲過程的調用:

為了更加直觀的介紹JDBC如何實現(xiàn)對MySQL數(shù)據(jù)庫存儲過程的調用,這里直接以例子的形式展示。

1、沒有任何輸入和輸出參數(shù)的存儲過程

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、只有兩個輸入?yún)?shù)的存儲過程

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、一個輸入?yún)?shù)一個輸出參數(shù)的存儲過程

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、兩個輸出參數(shù)的存儲過程

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);

數(shù)據(jù)庫中調用帶有輸出參數(shù)的存儲過程寫法,例如剛才兩個帶有輸出參數(shù)的

1 call jdbcprocinandout('lily',@value1);2 call jdbcprocallout(@vid,@vvalue);

-- 輸出參數(shù)前面必須帶“@”符號,變量名可以隨便寫一個合法變量都可以。

附上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数据库存储过程的调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。