一、MySQL数据库存储过程:

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、没有任何输入和输出参数的存储过程

 drop PROCEDURE if EXISTS jdbcprocnoinandout;
create PROCEDURE jdbcprocnoinandout()
BEGIN
select * from test.test;
end;

下面是Java代码:

 Connection connectionNoInAndOut = MyConnection.getConnection();
String jdbcprocNoInAndOut = "{call jdbcprocnoinandout()}";
CallableStatement csNoInAndOut = connectionNoInAndOut.prepareCall(jdbcprocNoInAndOut);
csNoInAndOut.execute();
ResultSet rsNoInAndOut = csNoInAndOut.getResultSet();
while (rsNoInAndOut.next()) {
System.out.println("jdbcprocnoinandout:"+rsNoInAndOut.getString("id")+"--------"+rsNoInAndOut.getString("value1"));
}
MyConnection.closeConnection(connectionNoInAndOut, csNoInAndOut, rsNoInAndOut);

2、只有两个输入参数的存储过程

 drop PROCEDURE if EXISTS jdbcprocallin;
create PROCEDURE jdbcprocallin(id int, value1 VARCHAR(20))
BEGIN
insert into test.test values(id,value1);
select * from test.test;
end;

Java代码:

 Connection connectionAllIn = MyConnection.getConnection();
String jdbcprocAllIn = "{call jdbcprocallin(?,?)}";
CallableStatement csAllIn = connectionAllIn.prepareCall(jdbcprocAllIn);
csAllIn.setInt(1, 1);
csAllIn.setString(2, "asdf");
csAllIn.execute();
ResultSet rsAllIn = csAllIn.getResultSet();
while (rsAllIn.next()) {
System.out.println("jdbcprocallin:"+rsAllIn.getString("id")+"--------"+rsAllIn.getString("value1"));
}
MyConnection.closeConnection(connectionAllIn, csAllIn, rsAllIn);

3、一个输入参数一个输出参数的存储过程

 drop PROCEDURE if EXISTS jdbcprocinandout;
create PROCEDURE jdbcprocinandout(in id VARCHAR(20), out value1 VARCHAR(20))
BEGIN
set value1 = CONCAT('我是:',id);
select value1;
end;

Java代码:

 Connection connectionInAndOut = MyConnection.getConnection();
String jdbcprocInAndOut = "{call jdbcprocinandout(?,?)}";
CallableStatement csInAndOut = connectionInAndOut.prepareCall(jdbcprocInAndOut);
csInAndOut.setString(1, "123123");
csInAndOut.registerOutParameter(2, Types.VARCHAR);
csInAndOut.execute();
ResultSet rsInAndOut = csInAndOut.getResultSet();
while (rsInAndOut.next()) {
System.out.println("jdbcprocinandout:"+csInAndOut.getString("value1"));
}
MyConnection.closeConnection(connectionInAndOut, csInAndOut, rsInAndOut);

4、两个输出参数的存储过程

 drop PROCEDURE if EXISTS jdbcprocallout;
create PROCEDURE jdbcprocallout(out outid VARCHAR(20), out outvalue1 VARCHAR(20))
BEGIN
select * into outid,outvalue1 from test.test limit 1;
select outid,outvalue1 ;
end;

Java代码:

 Connection connectionAllOut = MyConnection.getConnection();
String jdbcprocAllOut = "{call jdbcprocallout(?,?)}";
CallableStatement csAllOut = connectionAllOut.prepareCall(jdbcprocAllOut);
csAllOut.registerOutParameter(1, Types.VARCHAR);
csAllOut.registerOutParameter(2, Types.VARCHAR);
csAllOut.execute();
ResultSet rsAllOut = csAllOut.getResultSet();
while (rsAllOut.next()) {
System.out.println("jdbcprocallout:"+csAllOut.getString("outid")+"--------"+csAllOut.getString("outvalue1"));
}
MyConnection.closeConnection(connectionAllOut, csAllOut, rsAllOut);

数据库中调用带有输出参数的存储过程写法,例如刚才两个带有输出参数的

 call jdbcprocinandout('lily',@value1);
call jdbcprocallout(@vid,@vvalue);
-- 输出参数前面必须带“@”符号,变量名可以随便写一个合法变量都可以。

附上MyConnection类

 package net.lily.test;

 import java.sql.*;

 public class MyConnection {

     public static Connection getConnection() {
Connection connection = null;
String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useOldAliasMetadataBehavior=true";
String user = "root";
String pwd = "123456";
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;
} public static void closeConnection(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();
}
}
}
}
												

最新文章

  1. Scala特性: 隐式转换
  2. android-详解Android 6.0运行时权限
  3. Asp.net 将DataTable 或者DataSet 转换为Json 格式
  4. C#_delegate - Pair<T> & 简单顺序逆序 & 方法委托(在Pair类下)&枚举类型 混搭使用
  5. 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)
  6. Css定位-定位
  7. Codeforce 220 div2
  8. mvc3项目如何在IIS7.5上发布的
  9. 《实战Nginx》读书笔记
  10. 安装Redis 编译make gcc: error trying to exec 'cc1': execvp: 没有该文件或目录的错误
  11. Flask 之东方不败一
  12. Centos给文件设置了777权限仍不能访问解决方案
  13. Dubbo管控台安装(zookeeper单机版)
  14. Sql Server数据库之事务,视图,索引
  15. libsvm的使用
  16. requestFeature() must be called before adding content产生原因和解决办法
  17. Linux "bring up eth0 failed, eth0 seems not be presernt" 问题解决方案
  18. python版 google密码认证器
  19. BZOJ 2763 飞行路线(分层图最短路)题解
  20. 安装myeclipse的常见问题

热门文章

  1. CF #319 div 2 D
  2. HDU 3167 KMP
  3. nyoj 1238 最少换乘 (河南省第八届acm程序设计大赛)
  4. POJ-2201-Cartesian Tree(笛卡尔树)
  5. jquery ajax CORS 跨域訪问 WebService
  6. android自带的处理Bitmap out Memory 的处理,我仅仅是改变了些写法成为自己用的东西
  7. windows server使用 LetsEncrypt-Win-Simple来安装和使用用Let's Encrypt免费SSL证书
  8. CAS 4.0 配置开发手冊
  9. silverlight学习笔记——新手对silverlight的认识(1)
  10. mysql20170404代码实现