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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

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

? ? ? ? 一、MySQL數(shù)據(jù)庫(kù)存儲(chǔ)過程:

? ? ? ? 1、什么是存儲(chǔ)過程

? ? ? ? 存儲(chǔ)過程(英文:Stored Procedure)是在大型數(shù)據(jù)庫(kù)系統(tǒng)中,為了完畢特定功能而編寫的一組的SQL語(yǔ)句集。存儲(chǔ)過程經(jīng)編譯存儲(chǔ)在數(shù)據(jù)庫(kù)中。用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(假設(shè)該存儲(chǔ)過程帶有參數(shù))來運(yùn)行它。

? ? ? ? 2、與一般SQL語(yǔ)句相比。使用存儲(chǔ)過程有哪些長(zhǎng)處。有哪些缺點(diǎn)

? ? ? ??長(zhǎng)處:
? ? ? ??1)、降低了腳本的運(yùn)行環(huán)節(jié),縮短了獲取數(shù)據(jù)的時(shí)間。存儲(chǔ)過程僅僅在創(chuàng)建的時(shí)進(jìn)行編譯,在調(diào)用使用的時(shí)候直接運(yùn)行。不需再次編譯;而一般SQL語(yǔ)句每次運(yùn)行前都須要編譯一次,故效率沒有存儲(chǔ)過程高。
? ? ? ??2)、降低網(wǎng)絡(luò)傳輸量,提高了傳輸速度。

存儲(chǔ)過程編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)server上,使用的時(shí)候僅僅須要指定存儲(chǔ)過程的名字并給出參數(shù)(假設(shè)該存儲(chǔ)過程帶有參數(shù))就能夠了;而一般SQL語(yǔ)句須要將所運(yùn)行語(yǔ)句字符串傳輸?shù)綌?shù)據(jù)庫(kù)server端。相比于存儲(chǔ)過程而言向數(shù)據(jù)庫(kù)服務(wù)端傳送的字符串長(zhǎng)度比較大;
? ? ? ??3)、安全性比較高。為存儲(chǔ)過程參數(shù)賦值僅僅能使用問號(hào)傳參的形式(這一點(diǎn)能夠通過以下JDBC對(duì)MySQL數(shù)據(jù)庫(kù)存儲(chǔ)過程的調(diào)用樣例體現(xiàn)出來),這樣能夠防止SQL注入式攻擊;一般SQL語(yǔ)句也能夠做到防止SQL注入式攻擊,可是并非必須的。能夠?qū)rant、Deny以及Revoke權(quán)限應(yīng)用于存儲(chǔ)過程,即言能夠設(shè)定僅僅有某些用戶才具有對(duì)指定存儲(chǔ)過程的使用權(quán);
? ? ? ??缺點(diǎn):
? ? ? ??1)、假設(shè)在一個(gè)程序系統(tǒng)中大量的使用存儲(chǔ)過程,當(dāng)程序交付使用的時(shí)候隨著客戶需求的添加會(huì)導(dǎo)致數(shù)據(jù)結(jié)構(gòu)的變化,接著就是存儲(chǔ)過程的改動(dòng)。這樣系統(tǒng)維護(hù)就會(huì)越來越難而且代價(jià)也會(huì)越來越大。


? ? ? ? 3、如何創(chuàng)建存儲(chǔ)過程及創(chuàng)建存儲(chǔ)過程須要注意的地方

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

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

? ? ? ? 創(chuàng)建存儲(chǔ)過程的詳細(xì)樣例見以下JDBC對(duì)MySQL數(shù)據(jù)庫(kù)存儲(chǔ)過程的調(diào)用樣例。

? ? ? ??須要注意的地方:見以下JDBC對(duì)MySQL數(shù)據(jù)庫(kù)存儲(chǔ)過程的調(diào)用樣例內(nèi)創(chuàng)建存儲(chǔ)過程語(yǔ)句中的凝視;

? ? ? ? 二、JDBC對(duì)MySQL數(shù)據(jù)庫(kù)存儲(chǔ)過程的調(diào)用:

? ? ? ? 為了更加直觀的介紹JDBC怎樣實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)存儲(chǔ)過程的調(diào)用,這里直接以樣例的形式展示。

? ? ? ? 1、沒有不論什么輸入和輸出參數(shù)的存儲(chǔ)過程

package com.ghj.packageoftest;import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException;import com.ghj.packageoftool.LinkDB;/* 運(yùn)行本程序前需運(yùn)行的腳本: DELIMITER $$//<span style="font-family: Arial, Helvetica, sans-serif;">DELIMITER和$$之間要么沒有空格要么僅僅有一個(gè)空格,假設(shè)有多個(gè)空格,在運(yùn)行創(chuàng)建存儲(chǔ)過程語(yǔ)句時(shí)你會(huì)發(fā)現(xiàn)這樣是不能創(chuàng)建成功的</span> CREATE PROCEDURE noParam() BEGIN SELECT AVG(price) AS priceAvg FROM fruit; END$$ DELIMITER ; *//*** 沒有不論什么輸入和輸出參數(shù)的存儲(chǔ)過程* * @author GaoHuanjie*/ public class NoParam {public static void main(String args[]) throws SQLException {Connection connection = LinkDB.getMySqlConnection();String proStr = "{call noParam}";CallableStatement callableStatement = connection.prepareCall(proStr);callableStatement.execute();ResultSet resultSet = callableStatement.getResultSet();while (resultSet.next()) {System.out.println("產(chǎn)品的平均價(jià)格是:" + resultSet.getDouble("priceAvg") + "元");}LinkDB.close(connection, callableStatement, resultSet);} }

? ? ? ? 2、僅僅有兩個(gè)輸入?yún)?shù)的存儲(chǔ)過程

package com.ghj.packageoftest;import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException;import com.ghj.packageoftool.LinkDB;/* 執(zhí)行本程序前需執(zhí)行的腳本: DELIMITER $$ CREATE PROCEDURE inTwoParam(IN fruitName VARCHAR(12),IN fruitPrice DECIMAL(9,2))//說明:fruitPrice參數(shù)的數(shù)據(jù)類型與price列的數(shù)據(jù)類型不一致(price的類型為(8,2)),對(duì)這一現(xiàn)象應(yīng)該有所感悟。 BEGIN SELECT * FROM fruit WHERE NAME LIKE CONCAT('%',fruitName,'%') AND price < fruitPrice;//注意:CONCAT('%',fruitName,'%')不能為'%'+fruitName+'%' END$$ DELIMITER ; *//*** 僅僅有兩個(gè)輸入?yún)?shù)的存儲(chǔ)過程* * @author GaoHuanjie*/ public class InTwoParam {public static void main(String args[]) throws SQLException {Connection connection = LinkDB.getMySqlConnection();String procStr = "{call inTwoParam(?

,?)}"; CallableStatement callableStatement = connection.prepareCall(procStr); callableStatement.setString(1, "蓮"); callableStatement.setDouble(2, 88.88);//對(duì)DECIMAL類型的屬性設(shè)值要使用setDouble方法。 callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); System.out.println("名稱包括‘蓮’字且價(jià)格小于88.88元的水果有:"); while (resultSet.next()) { System.err.println("名稱:" + resultSet.getString("name") +"、價(jià)格:" + resultSet.getDouble("price") + "元"+"、產(chǎn)地:" + resultSet.getString("address")); } LinkDB.close(connection, callableStatement, resultSet); } }

? ? ? ? 3、僅僅有兩個(gè)輸出參數(shù)的存儲(chǔ)過程

package com.ghj.packageoftest;import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import java.sql.Types;import com.ghj.packageoftool.LinkDB;/* 執(zhí)行本程序前需執(zhí)行的腳本: DELIMITER $$ CREATE PROCEDURE outTwoParam(OUT fruitName VARCHAR(12),OUT fruitPrice DECIMAL(5,3) ) BEGIN SELECT name INTO fruitName FROM fruit WHERE name='蓮霧'; SELECT price INTO fruitPrice FROM fruit WHERE NAME='蓮霧'; END $$ DELIMITER ; 注意:上面兩條查詢語(yǔ)句不能合成一個(gè)SQL語(yǔ)句——SELECT NAME INTO fruitName, price INTO fruitPrice FROM fruit WHERE NAME='蓮霧'; *//*** 僅僅有兩個(gè)輸出參數(shù)的存儲(chǔ)過程* * @author GaoHuanjie*/ public class OutTwoParam {public static void main(String args[]) throws SQLException {Connection connection = LinkDB.getMySqlConnection();String proStr = "{call outTwoParam(?

,?)}"; 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 +"、水果價(jià)格:" + fruitPrice + "元"); LinkDB.close(connection, callableStatement, null); } }

? ? ? ? 4、含有一個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)的存儲(chǔ)過程

package com.ghj.packageoftest;import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import java.sql.Types;import com.ghj.packageoftool.LinkDB;/* 執(zhí)行本程序前需執(zhí)行的腳本: DELIMITER $$ CREATE PROCEDURE inOneParamAndOutOneParam(IN fruitName VARCHAR(12),OUT fruitPrice DECIMAL(7,3)) BEGIN SELECT price FROM fruit WHERE NAME=fruitName INTO fruitPrice; END $$ DELIMITER ; *//*** 含有一個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)的存儲(chǔ)過程* * @author GaoHuanjie*/ public class InOneParamAndOutOneParam {public static void main(String args[]) throws SQLException {Connection connection=LinkDB.getMySqlConnection();CallableStatement callableStatement=null;String procStr="{call inOneParamAndOutOneParam(?

,?)}"; 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+"的價(jià)格為:"+fruitPrice+"元"); LinkDB.close(connection, callableStatement, null); } }

? ? ? ? 5、輸入?yún)?shù)即輸出參數(shù)的存儲(chǔ)過程

package com.ghj.packageoftest;import java.sql.*;import com.ghj.packageoftool.LinkDB;/*執(zhí)行本程序前需執(zhí)行的腳本: DELIMITER $$ CREATE PROCEDURE inOneParamISOutOneParam(INOUT fruitName VARCHAR(12)) BEGIN SELECT NAME INTO fruitName FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') LIMIT 0,1; END $$ DELIMITER ; 或 DELIMITER $$ CREATE PROCEDURE inOneParamISOutOneParam(INOUT fruitName VARCHAR(12)) BEGIN SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') LIMIT 0,1 INTO fruitName; END $$ DELIMITER ;注意上面查詢語(yǔ)句不能這樣寫:SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') INTO fruitName LIMIT 0,1; 注意:對(duì)照3、4和5Java文件內(nèi)創(chuàng)建存儲(chǔ)過程腳本中“INTO”keyword的位置你一定深有收獲。呵呵呵,偷點(diǎn)懶。在此就不總結(jié)了。 *//*** 輸入?yún)?shù)即輸出參數(shù)的存儲(chǔ)過程* * @author GaoHuanjie*/ public class InOneParamISOutOneParam {public static void main(String args[]) throws SQLException {Connection con = LinkDB.getMySqlConnection();CallableStatement callableStatement = null;String procStr = "{call inOneParamISOutOneParam(?

)}"; 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、假設(shè)把上面代碼拷貝下來你會(huì)發(fā)現(xiàn)缺少LinkDB類,現(xiàn)貼出該類:

package com.ghj.packageoftool;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;/*** 連接數(shù)據(jù)庫(kù)* * @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;}/*** 關(guān)閉釋放全部的資源* * @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、假設(shè)運(yùn)行創(chuàng)建存儲(chǔ)過程的SQL腳本,你會(huì)發(fā)現(xiàn)缺少名為fruit類。現(xiàn)貼出創(chuàng)建該表的SQL語(yǔ)句:

CREATE DATABASE `test`; USE `test`; CREATE TABLE `fruit` (`id` char(36) NOT NULL COMMENT '標(biāo)識(shí)',`name` varchar(12) NOT NULL COMMENT '名稱',`price` decimal(8,2) NOT NULL COMMENT '單位價(jià)格',`address` varchar(300) DEFAULT NULL COMMENT '產(chǎn)地',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','中國(guó)'), ('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','泰國(guó)');

? ? ? ? 【0分下載演示資源

轉(zhuǎn)載于:https://www.cnblogs.com/jhcelue/p/7019966.html

總結(jié)

以上是生活随笔為你收集整理的JDBC对MySQL数据库存储过程的调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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