JDBC对MySQL数据库存储过程的调用
? ? ? ? 一、MySQL數據庫存儲過程:
? ? ? ? 1、什么是存儲過程
? ? ? ? 存儲過程(英文:Stored Procedure)是在大型數據庫系統(tǒng)中,為了完畢特定功能而編寫的一組的SQL語句集。存儲過程經編譯存儲在數據庫中。用戶通過指定存儲過程的名字并給出參數(假設該存儲過程帶有參數)來運行它。
? ? ? ? 2、與一般SQL語句相比。使用存儲過程有哪些長處。有哪些缺點
? ? ? ??長處:
? ? ? ??1)、降低了腳本的運行環(huán)節(jié),縮短了獲取數據的時間。存儲過程僅僅在創(chuàng)建的時進行編譯,在調用使用的時候直接運行。不需再次編譯;而一般SQL語句每次運行前都須要編譯一次,故效率沒有存儲過程高。
? ? ? ??2)、降低網絡傳輸量,提高了傳輸速度。
存儲過程編譯后存儲在數據庫server上,使用的時候僅僅須要指定存儲過程的名字并給出參數(假設該存儲過程帶有參數)就能夠了;而一般SQL語句須要將所運行語句字符串傳輸到數據庫server端。相比于存儲過程而言向數據庫服務端傳送的字符串長度比較大;
? ? ? ??3)、安全性比較高。為存儲過程參數賦值僅僅能使用問號傳參的形式(這一點能夠通過以下JDBC對MySQL數據庫存儲過程的調用樣例體現出來),這樣能夠防止SQL注入式攻擊;一般SQL語句也能夠做到防止SQL注入式攻擊,可是并非必須的。能夠將Grant、Deny以及Revoke權限應用于存儲過程,即言能夠設定僅僅有某些用戶才具有對指定存儲過程的使用權;
? ? ? ??缺點:
? ? ? ??1)、假設在一個程序系統(tǒng)中大量的使用存儲過程,當程序交付使用的時候隨著客戶需求的添加會導致數據結構的變化,接著就是存儲過程的改動。這樣系統(tǒng)維護就會越來越難而且代價也會越來越大。
? ? ? ? 3、如何創(chuàng)建存儲過程及創(chuàng)建存儲過程須要注意的地方
? ? ? ? 存儲過程的創(chuàng)建格式為:
? ? ? ??create procedure 存儲過程名([[IN |OUT |INOUT ] 參數名 數據類形...])
? ? ? ??begin
? ? ? ??存儲過程體
? ? ? ??end
? ? ? ? 創(chuàng)建存儲過程的詳細樣例見以下JDBC對MySQL數據庫存儲過程的調用樣例。
? ? ? ??須要注意的地方:見以下JDBC對MySQL數據庫存儲過程的調用樣例內創(chuàng)建存儲過程語句中的凝視;
? ? ? ? 二、JDBC對MySQL數據庫存儲過程的調用:
? ? ? ? 為了更加直觀的介紹JDBC怎樣實現對MySQL數據庫存儲過程的調用,這里直接以樣例的形式展示。
? ? ? ? 1、沒有不論什么輸入和輸出參數的存儲過程
? ? ? ? 2、僅僅有兩個輸入參數的存儲過程
,?)}"; CallableStatement callableStatement = connection.prepareCall(procStr); callableStatement.setString(1, "蓮"); callableStatement.setDouble(2, 88.88);//對DECIMAL類型的屬性設值要使用setDouble方法。 callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); System.out.println("名稱包括‘蓮’字且價格小于88.88元的水果有:"); while (resultSet.next()) { System.err.println("名稱:" + resultSet.getString("name") +"、價格:" + resultSet.getDouble("price") + "元"+"、產地:" + resultSet.getString("address")); } LinkDB.close(connection, callableStatement, resultSet); } }
? ? ? ? 3、僅僅有兩個輸出參數的存儲過程
,?)}"; CallableStatement callableStatement = connection.prepareCall(proStr); callableStatement.registerOutParameter(1, Types.VARCHAR); callableStatement.registerOutParameter(2, Types.DECIMAL); callableStatement.execute(); String fruitName = callableStatement.getString(1); double fruitPrice = callableStatement.getDouble(2);// 獲取DECIMAL類型的屬性要使用getDouble方法。
System.out.println("水果名稱:" + fruitName +"、水果價格:" + fruitPrice + "元"); LinkDB.close(connection, callableStatement, null); } }
? ? ? ? 4、含有一個輸入參數和一個輸出參數的存儲過程
,?)}"; callableStatement=connection.prepareCall(procStr); String fruitName = "蓮霧"; callableStatement.setString(1, fruitName); callableStatement.registerOutParameter(2, Types.DECIMAL); callableStatement.execute(); double fruitPrice=callableStatement.getDouble(2);//獲取DECIMAL類型的屬性要使用getDouble方法。
System.out.println(fruitName+"的價格為:"+fruitPrice+"元"); LinkDB.close(connection, callableStatement, null); } }
? ? ? ? 5、輸入參數即輸出參數的存儲過程
)}"; callableStatement = con.prepareCall(procStr); callableStatement.setString(1, "蓮"); callableStatement.registerOutParameter(1, Types.VARCHAR); callableStatement.execute(); String fruitName = callableStatement.getString(1); System.out.println("表中水果名稱含有‘蓮’字的一中水果的名稱是:" + fruitName); LinkDB.close(con, callableStatement, null); } }
? ? ? ? 說明:
? ? ? ? 1、假設把上面代碼拷貝下來你會發(fā)現缺少LinkDB類,現貼出該類:
package com.ghj.packageoftool;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;/*** 連接數據庫* * @author GaoHuanjie*/ public class LinkDB {/*** 功能:獲取與MySql的連接* * @author GaoHuanjie*/public static Connection getMySqlConnection() {Connection connection = null;String url = "jdbc:mysql://localhost:3306/test";String user = "root";String pwd = "";String driverName = "com.mysql.jdbc.Driver";try {Class.forName(driverName);connection = DriverManager.getConnection(url, user, pwd);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} return connection;}/*** 關閉釋放全部的資源* * @author GaoHuanjie*/public static void close(Connection con, PreparedStatement ps, ResultSet rs) {if (rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (ps != null){try {ps.close();} catch (SQLException e) {e.printStackTrace();}}if (con != null){try {con.close();} catch (SQLException e) {e.printStackTrace();}}} }
? ? ? ? 2、假設運行創(chuàng)建存儲過程的SQL腳本,你會發(fā)現缺少名為fruit類。現貼出創(chuàng)建該表的SQL語句:
CREATE DATABASE `test`; USE `test`; CREATE TABLE `fruit` (`id` char(36) NOT NULL COMMENT '標識',`name` varchar(12) NOT NULL COMMENT '名稱',`price` decimal(8,2) NOT NULL COMMENT '單位價格',`address` varchar(300) DEFAULT NULL COMMENT '產地',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='水果表';insert into `fruit`(`id`,`name`,`price`,`address`) values ('27640c30-8df5-4cf2-916e-c28e0b2b1b52','山竹','24.45','馬來西亞'), ('46ac8392-9922-4593-89a3-517a9e516733','菠蘿','19.41','巴西'), ('63061a9f-3a0e-4140-98e0-8b1e13e4eab3','哈密瓜','17.77','中國'), ('7ef0c286-b8b1-4e1e-9a8a-36bce703cf18','鱷梨','30.80','墨西哥'), ('a1cf5251-9311-4c7f-be10-3532d8c16291','樹莓','117.50','瑞士'), ('c397aed0-a39a-49c5-91ee-7fc0579ddb20','蓮霧','77.33','印度尼西亞'), ('e8068fa1-a8e7-4025-89e2-36c1d5d23c74','榴蓮','16.50','泰國');
? ? ? ? 【0分下載演示資源】
轉載于:https://www.cnblogs.com/jhcelue/p/7019966.html
總結
以上是生活随笔為你收集整理的JDBC对MySQL数据库存储过程的调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017/6/15
- 下一篇: OAuth2.0学习(1-9)新浪开放平