一、MySQL数据库存储过程:

1、什么是存储过程

存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完毕特定功能而编写的一组的SQL语句集。存储过程经编译存储在数据库中。用户通过指定存储过程的名字并给出參数(假设该存储过程带有參数)来运行它。

2、与一般SQL语句相比。使用存储过程有哪些长处。有哪些缺点

长处:
        1)、降低了脚本的运行环节,缩短了获取数据的时间。存储过程仅仅在创建的时进行编译,在调用使用的时候直接运行。不需再次编译;而一般SQL语句每次运行前都须要编译一次,故效率没有存储过程高。
        2)、降低网络传输量,提高了传输速度。

存储过程编译后存储在数据库server上,使用的时候仅仅须要指定存储过程的名字并给出參数(假设该存储过程带有參数)就能够了;而一般SQL语句须要将所运行语句字符串传输到数据库server端。相比于存储过程而言向数据库服务端传送的字符串长度比較大;
        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、没有不论什么输入和输出參数的存储过程

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;/*
运行本程序前需运行的脚本:
DELIMITER $$//<span style="font-family: Arial, Helvetica, sans-serif;">DELIMITER和$$之间要么没有空格要么仅仅有一个空格,假设有多个空格,在运行创建存储过程语句时你会发现这样是不能创建成功的</span>
CREATE PROCEDURE noParam()
BEGIN
SELECT AVG(price) AS priceAvg FROM fruit;
END$$
DELIMITER ;
*//*** 没有不论什么输入和输出參数的存储过程* * @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("产品的平均价格是:" + resultSet.getDouble("priceAvg") + "元");}LinkDB.close(connection, callableStatement, resultSet);}
}

2、仅仅有两个输入參数的存储过程

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;/*
执行本程序前需执行的脚本:
DELIMITER $$
CREATE PROCEDURE inTwoParam(IN fruitName VARCHAR(12),IN fruitPrice DECIMAL(9,2))//说明:fruitPrice參数的数据类型与price列的数据类型不一致(price的类型为(8,2)),对这一现象应该有所感悟。
BEGIN
SELECT * FROM fruit WHERE NAME LIKE CONCAT('%',fruitName,'%') AND price < fruitPrice;//注意:CONCAT('%',fruitName,'%')不能为'%'+fruitName+'%'
END$$
DELIMITER ;
*//*** 仅仅有两个输入參数的存储过程* * @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);//对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、仅仅有两个输出參数的存储过程

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;/*
执行本程序前需执行的脚本:
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 ;
注意:上面两条查询语句不能合成一个SQL语句——SELECT NAME INTO fruitName, price INTO fruitPrice FROM fruit WHERE NAME='莲雾';
*//*** 仅仅有两个输出參数的存储过程* * @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 +"、水果价格:" + fruitPrice + "元"); LinkDB.close(connection, callableStatement, null); } }

4、含有一个输入參数和一个输出參数的存储过程

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;/*
执行本程序前需执行的脚本:
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 ;
*//*** 含有一个输入參数和一个输出參数的存储过程* * @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+"的价格为:"+fruitPrice+"元"); LinkDB.close(connection, callableStatement, null); } }

5、输入參数即输出參数的存储过程

package com.ghj.packageoftest;import java.sql.*;import com.ghj.packageoftool.LinkDB;/*执行本程序前需执行的脚本:
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 ;注意上面查询语句不能这样写:SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') INTO fruitName LIMIT 0,1;
注意:对照3、4和5Java文件内创建存储过程脚本中“INTO”keyword的位置你一定深有收获。呵呵呵,偷点懒。在此就不总结了。
*//*** 输入參数即输出參数的存储过程* * @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、假设把上面代码拷贝下来你会发现缺少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、假设运行创建存储过程的SQL脚本,你会发现缺少名为fruit类。现贴出创建该表的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数据库存储过程的调用相关推荐

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

    1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用户通过指定存储过程的名字并给出参 ...

  2. mysql数据库存储过程及调用方法

    mysql数据库存储过程及调用方法 mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出.6.0不仅支持大型数据库如oracle等的绝大部分功 能,如存储过程.视图.触发 ...

  3. java JDBC连接MySQL数据库调用存储过程进行查询

    java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...

  4. 使用shell脚本调用mysql数据库存储过程,并设置定时任务

    本来是要mysql数据库中创建事件任务来,定时执行存储过程,做数据传输的...后来由于种种原因,就使用crontab来定时执行,调用存储过程. 实现这个数据传输分为两步: 第一步:编写shell脚本调 ...

  5. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  6. jaba窗体连接mysql增删改查_知识实现——Java使用jdbc连接MySql数据库,实现增删改查...

    Java使用jdbc连接MySql数据库,实现增删改查 首先,导入MySql连接数据库的jar包,我用的是 mysql连接jar包 DB类,用于获得数据库连接 import java.sql.Driv ...

  7. JDBC连接MySQL数据库及示例

    JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  8. Spring使用JDBC访问MySQL数据库

    在Java应用程序开发中,使用JDBC访问MySQL数据库是Java开发者常用的技术.在Spring框架中,Spring对JDBC又进行了封装,简化了程序访问数据库的复杂度.本课主要讨论在Spring ...

  9. java mysql教程基于_java基于jdbc连接mysql数据库功能实例详解

    本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JD ...

最新文章

  1. 批量实现面向对象的实例
  2. Facebook 开源聊天机器人Blender,经94 亿个参数强化训练,更具“人情味”
  3. strut2以及路径的一些问题
  4. git 出现 fatal: refusing to merge unrelated histories 错误
  5. 为什么说Swift正在颠覆整个互联网生态?
  6. linux contos7防火墙加端口,Linux:centos7防火墙开放端口
  7. WMS仓储管理系统有那些功能?
  8. MIME —— 从邮件传输到数据格式的定义
  9. Python安装Pytorch教程(图文详解)
  10. SQL Server 常用函数总结
  11. 深度学习中网络在训练时不收敛的原因
  12. 为 Form Library 开发工作流,如何读取 InfoPath 表单内容
  13. 跨考西北工业大学计算机专硕,西工大计算机专硕400+上岸学长经验分享
  14. 【C标准库1】math.h
  15. poi 删除 word文档中的图片
  16. 面试官偷偷给我的软件测试工程师面试题,看完你还怕拿不到offer?
  17. Kali Linux 使用远程桌面连接——xrdpxfce
  18. 微信小程序OTO商城(商务端)
  19. 粗放时代到规范时代,爬虫该何去何从?
  20. VLC介绍以及库的使用

热门文章

  1. 解决Office 2016客户端如何同SharePoint Server2016安装在一起
  2. 不要在构造和析构函数中调用虚函数
  3. CSS3学习——设计优雅的数据表格
  4. 甲骨文指控 Google Android 复制其代码
  5. 11-2 操作系统发展
  6. mysql之case_mysql存储过程之case语句
  7. 字符指针(子串个数统计)
  8. csg显示寻找专用服务器失败,支持邻近发现过程的方法和装置
  9. 智稳双全--AnalyticDB如何助力菜鸟运配双十一
  10. 企业云上安全事件突发,这五个问题值得运维大佬们日常自查!