设为首页 加入收藏

TOP

JDBC对MySQL数据库存储过程的调用(一)
2015-07-24 11:08:15 来源: 作者: 【 】 浏览:1
Tags:JDBC MySQL 数据库 存储 过程 调用

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

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 $$//DELIMITER和$$之间要么没有空格要么只有一个空格,如果有多个空格,在执行创建存储过程语句时你会发现这样是不能创建成功的
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 {
		C
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql在linux上的安装之一yum安装 下一篇MySQL性能优化(二)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)