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数据库存储过程的调用相关推荐

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

    一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完毕特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中.用 ...

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

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

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

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

  4. Mysql数据库存储过程基本语法讲解

    Mysql数据库存储过程基本语法讲解 一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行.存储过程如同一门程序设计语言, ...

  5. MySQL 案例实战--MySQL数据库 存储过程 存储函数

    MySQL数据库 存储过程 & 存储函数 前言 一.什么是存储过程 & 存储函数 二.存储过程的创建和调用 三.存储函数的创建和调用 前言 本环境是基于 Centos 7.8 系统构建 ...

  6. JAVA通过JDBC连接并操作MySQL数据库

    JAVA通过JDBC连接并操作MySQL数据库 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提 ...

  7. MySQL JDBC驱动版本与MySQL数据库版本对应关系

    前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致.查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一 ...

  8. MySQL数据库存储过程讲解与实例

    存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储 ...

  9. MySQL数据库存储过程

    存储过程相关命令汇总 存储过程 存储过程优化 再说存储过程的输出参数 再说WHILE 和 REPEAT循环 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQ ...

最新文章

  1. Xamarin.Android提示找不到mono.Android.Support.v4
  2. C++ Stack 与String
  3. MySQL内核月报 2015.01-MySQL · 捉虫动态· InnoDB自增列重复值问题
  4. 118. Leetcode 392. 判断子序列 (动态规划-子序列问题)
  5. 如何设计出一个有灵魂的「签到功能」?
  6. 【转】 DOTA2中的伪随机及其lua实现
  7. NeurIPS 2018 中的贝叶斯研究
  8. Spring Boot文档阅读笔记-构建Restful风格的WebService客户端
  9. 使用.NET Core 3进行Linux编程:第3章
  10. 论文|SDNE的算法原理、代码实现和在阿里凑单场景中的应用说明(附代码)
  11. Linux禁止ping以及开启ping的方法
  12. 免费下载IEEE论文的网站
  13. Ubuntu的版本号命名规则
  14. 2022年国内短信平台大全
  15. Cisco路由器配置dhcp服务器
  16. java毕业设计大学生体检管理系统Mybatis+系统+数据库+调试部署
  17. 完全激活office2007
  18. 第17章 其他数据库日志【4.日志与备份篇】【MySQL高级】
  19. adb devices offline 怎么处理
  20. 脚踏实地、仰望星空的贵系学子们

热门文章

  1. php 判断心跳包报错,第29问:MySQL 的复制心跳说它不想跳了
  2. php微信小程序多图上传,tp5实现微信小程序多图片上传到服务器功能
  3. shell 脚本实现退点输出
  4. 随手练——洛谷-P1008 / P1618 三连击(暴力搜索)
  5. 微信公众号开发经验总结
  6. Android学习(二十)Notification通知栏
  7. 【转】Mybatis/Ibatis,数据库操作的返回值
  8. UVA 12563 Jin Ge Jin Qu hao
  9. 算法五——字符串匹配(上)
  10. codeUp 2031 To fill or not to fill 复杂贪心