一、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();
}
}
}
}
												

JDBC对MySQL数据库存储过程的调用的更多相关文章

  1. ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库

    1.MySQL存储过程   1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if  while)等等 的sql语句   1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...

  2. Java通过JDBC 进行MySQL数据库操作

    转自: http://blog.csdn.net/tobetheender/article/details/52772157 Java通过JDBC 进行MySQL数据库操作 原创 2016年10月10 ...

  3. Java基础93 JDBC连接MySQL数据库

    本文知识点(目录): 1.什么是jdbc     2.jdbc接口的核心API     3.使用JDBC技术连接MySQL数据库的方法    4.使用Statement执行sql语句(DDL.DML. ...

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

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

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

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

  6. JDBC连接MySQL数据库基础

    主要内容 MySQL的基本操作和基本SQL语法 使用JDBC进行MySQL数据库的开发 使用DriverManager.Connection.PreparedStatement.ResultSet对数 ...

  7. java用JDBC连接MySQL数据库的详细知识点

    想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downlo ...

  8. 如何使用JDBC连接Mysql数据库

    //java类名BaseDaopublic class BaseDao {    private Connection conn = null; // 声明Connection对象,Connectio ...

  9. JDBC连接MySQL数据库代码

    ******************************************************1********************************************* ...

随机推荐

  1. 可拖动的div——demo

    可拖动的div——demo 我们经常会遇到这样的注册界面 我们以前经常可以遇到这种需要注册的网站,如上图: 上图有一个特点,即是上述注册框其实是一个div,同时可以拖动,以下做一个简单的实例,就可以实 ...

  2. HDU 4523

    很简单了, 当m>=3&&m<=n+p时是yes import java.math.BigInteger; import java.util.Scanner; public ...

  3. 3.2 Piecewise Linear Interpolation(站点)

    Newton Interpolation: https://www.youtube.com/watch? v=EyRQXA56asI Piecewise Linear Interpolation: h ...

  4. lsyncd + rsync 实时同步搭建

    一.inotify和lsync inotify和lsyncd对比一下,发现虽然lsyncd没有inotify那么真正的实时同步,但是lsyncd的同步基本上可以满足基本实时同步的要求,而且lsyncd ...

  5. mysql无密码重启

    mysql无密码重启 /etc/init.d/mysql stopnohup /usr/bin/mysqld_safe --user=mysql --skip-grant-tables &

  6. 在CentOS 6 中安装 Apache,Mysql, PHP

    1.安装Apache 在终端中输入以下的命令就能够安装Apache了: sudo yum install httpd sudo的意思是用root用户做什么操作.要点击y就确认下载安装了,非常方便. 然 ...

  7. IntelliJ IDEA 问题总结之二(待补充) —— 快捷键、主题样式、导出jar、sqlite

    随着对idea的使用,问题越来越多,開始第二篇问题总结. 1.快捷键. 用惯了eclipse再用idea后,快捷键就是一个大问题. 并且网上idea的快捷键有非常多版本号.不知道是不是老版本号和新版本 ...

  8. commons-fileupload上传文件(1)

    近期,写一个上传图片的功能.于是用到commons-fileupload这个组件.提过form提交表单到后台(这里没实用到structs框架).在后台List pl = dfu.parseReques ...

  9. 【概念的辨异】—— ISO C 与 POSIX C(C standard library 与 C POSIX library)

    ISO C 表示 C Standard Library,也就是 C 标准库. 二者的主要区别在于: POSIX 是 C 标准库的超集(也即是从内容上,C 标准库是 POSIX 库的一部分,POSIX ...

  10. CSS实现列表li边框重合问题

    CSS实现列表li边框重合问题 2017年04月13日 21:04:18 阅读数:5066 在我们写东西的时候经常要用到ul,但是也经常会出现li边框重合的问题,如下图:  可以看到每个格子的右边框和 ...