`

MySQL存储过程以及在JAVA中的程序调用

 
阅读更多

http://blog.csdn.net/zhaoweitco/article/details/5448635

 

存储过程是一种存储在数据库中的程序(就像正规语言里的子程序一样),准确的来说,MySQL支持的“routines(例程)”有两种:一是我们说的存储过程, 二是在其他SQL语句中可以返回值的函数(使用起来和Mysql预装载的函数一样,如pi())。本文是为初学习MySQL存储过程的朋友写的,在本文中我们以在MySQL的CLI(command line interface)中建立一个存储过程的示例开始,然后通过在Java程序中调用我们创建好的存储过程,让读者对MySQL的存储过程有个大概的了解和入门。

一、创建MySQL存储过程示例

下面是具体的创建过程:

view plaincopy to clipboardprint?
--启动MySQL服务 
C:/Documents and Settings/Zengming Zhang>net start mysql 

MySQL 服务已经启动成功。 

--登录MySQL控制台 
C:/Documents and Settings/Zengming Zhang>mysql -u root -p 
Enter password: ********** 
Welcome to the MySQL monitor. Commands end with ; or /g. 
Your MySQL connection id is 1 to server version: 5.0.18-nt 

Type 'help;' or '/h' for help. Type '/c' to clear the buffer. 

--选择数据库 
mysql> use test; 
Database changed 

--创建示例用表 
mysql> create table zzm( 
-> id int primary key auto_increment, 
-> name varchar(10) 
-> ); 
Query OK, 0 rows affected (0.20 sec) 
mysql> insert into zzm(name) values('zhang'); 
Query OK, 1 row affected (0.08 sec) 

mysql> insert into zzm(name) values('zeng'); 
Query OK, 1 row affected (0.05 sec) 

mysql> insert into zzm(name) values('ming'); 
Query OK, 1 row affected (0.05 sec) 

mysql> select * from zzm; 
+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | zhang | 
| 2 | zeng | 
| 3 | ming | 
+----+-------+ 
3 rows in set (0.00 sec) 

--更改命令结束符(因为在procedure中经常要用到默认的命令结束符--分号(;) 
--所以在创建procedure的时候需要定义新的结束符以说明创建procedure的命令结束) 
--这里将结束符号改成美元符号--$ 
mysql> delimiter $ 

--创建存储过程p3 
--此存储过程的过程名是p3,该过程包含两个参数, 
--一个是输入类型的(以IN标示),参数名是nameid,类型是int, 
--一个是输出类型的(以OUT标示),参数名是person_name,类型是varchar(10) 
--此存储过程的作用是查询出zzm表的全部内容,会输出结果集(data set),然后 
--再查询表中记录的ID是nameid的字段name,将其输出到第二个输出类型的参数里面,这个查询 
--不会输出结果集。 
mysql> create procedure p3(IN nameid int, OUT person_name varchar(10)) 
-> begin 
-> select * from test.zzm; 
-> select zzm.name into person_name from test.zzm where zzm.id = nameid; 
-> end 
-> $ 
Query OK, 0 rows affected (0.00 sec) 

--创建完成,查看数据库中所有已经创建的存储过程 
mysql> show procedure status $ 
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+ 
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | 
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+ 
| test | p3 | PROCEDURE | root@localhost | 2009-08-18 16:40:21 | 2009-08-18 16:40:21 | DEFINER | | 
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+ 
1 row in set (0.02 sec) 

--调用存储过程 
mysql> call p3(3,@name) $ 
+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | zhang | 
| 2 | zeng | 
| 3 | ming | 
+----+-------+ 
3 rows in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

mysql> select @name $ 
+-------+ 
| @name | 
+-------+ 
| ming | 
+-------+ 
1 row in set (0.00 sec) 
--启动MySQL服务
C:/Documents and Settings/Zengming Zhang>net start mysql

MySQL 服务已经启动成功。

--登录MySQL控制台
C:/Documents and Settings/Zengming Zhang>mysql -u root -p
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 1 to server version: 5.0.18-nt

Type 'help;' or '/h' for help. Type '/c' to clear the buffer.

--选择数据库
mysql> use test;
Database changed

--创建示例用表
mysql> create table zzm(
-> id int primary key auto_increment,
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.20 sec)
mysql> insert into zzm(name) values('zhang');
Query OK, 1 row affected (0.08 sec)

mysql> insert into zzm(name) values('zeng');
Query OK, 1 row affected (0.05 sec)

mysql> insert into zzm(name) values('ming');
Query OK, 1 row affected (0.05 sec)

mysql> select * from zzm;
+----+-------+
| id | name |
+----+-------+
| 1 | zhang |
| 2 | zeng |
| 3 | ming |
+----+-------+
3 rows in set (0.00 sec)

--更改命令结束符(因为在procedure中经常要用到默认的命令结束符--分号(;)
--所以在创建procedure的时候需要定义新的结束符以说明创建procedure的命令结束)
--这里将结束符号改成美元符号--$
mysql> delimiter $

--创建存储过程p3
--此存储过程的过程名是p3,该过程包含两个参数,
--一个是输入类型的(以IN标示),参数名是nameid,类型是int,
--一个是输出类型的(以OUT标示),参数名是person_name,类型是varchar(10)
--此存储过程的作用是查询出zzm表的全部内容,会输出结果集(data set),然后
--再查询表中记录的ID是nameid的字段name,将其输出到第二个输出类型的参数里面,这个查询
--不会输出结果集。
mysql> create procedure p3(IN nameid int, OUT person_name varchar(10))
-> begin
-> select * from test.zzm;
-> select zzm.name into person_name from test.zzm where zzm.id = nameid;
-> end
-> $
Query OK, 0 rows affected (0.00 sec)

--创建完成,查看数据库中所有已经创建的存储过程
mysql> show procedure status $
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment |
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
| test | p3 | PROCEDURE | root@localhost | 2009-08-18 16:40:21 | 2009-08-18 16:40:21 | DEFINER | |
+------+------+-----------+----------------+---------------------+---------------------+---------------+---------+
1 row in set (0.02 sec)

--调用存储过程
mysql> call p3(3,@name) $
+----+-------+
| id | name |
+----+-------+
| 1 | zhang |
| 2 | zeng |
| 3 | ming |
+----+-------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @name $
+-------+
| @name |
+-------+
| ming |
+-------+
1 row in set (0.00 sec)

二、在Java程序中调用存储过程的程序示例

view plaincopy to clipboardprint?
import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Types; 

public class Main { 

public static void main(String[] args) { 
/* JDBC连接MySQL数据库的参数 */ 
String driverName = "com.mysql.jdbc.Driver"; 
String userName = "root"; 
String userPasswd = "nicegiving"; 
String dbName = "test"; 
String url = "jdbc:mysql://localhost/" + dbName + "?user=" + userName 
+ "&password=" + userPasswd; 
Connection connection = null; 
CallableStatement stmt = null; 

try { 
// 加载数据库驱动程序 
Class.forName(driverName).newInstance(); 
// 连接数据库 
connection = DriverManager.getConnection(url); 
// 调用存储过程,此存储过程有2个参数 
stmt = connection.prepareCall("{call p3(?,?)}"); 
// 第一个参数是输入的,在此设置第一个参数的值:将第一个参数设置成整数值3 
stmt.setInt(1, 3); 
// 第二个参数是输出的,在此设置第二个参数的输出类型为VARCHAR 
stmt.registerOutParameter(2, Types.VARCHAR); 
// 执行存储过程 
boolean hadResults = stmt.execute(); 

// 如果有查询语句的话,此执行过程会返回结果集,在此处理结果集里面的东西 
System.out.println("Data from table:"); 
while (hadResults) { 
ResultSet rs = stmt.getResultSet(); 
while(rs.next()){ 
String id = rs.getString(1); 
String name = rs.getString(2); 
System.out.println("ID = "+id+"/tName = " + name); 

hadResults = stmt.getMoreResults(); 


// 获取存储过程的返回值 
System.out.println("/nData from procedure:"); 
String name = stmt.getString(2); // 获得第二个参数,因为第二个参数是输出类型的 
System.out.println("Name = " + name); 
} catch (Exception e) { 
System.out.println(e.toString()); 
} finally { 
try { 
stmt.close(); 
connection.close(); 
} catch (Exception ex) { 
System.out.println(ex.getMessage()); 





import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Types;

public class Main {

public static void main(String[] args) {
/* JDBC连接MySQL数据库的参数 */
String driverName = "com.mysql.jdbc.Driver";
String userName = "root";
String userPasswd = "nicegiving";
String dbName = "test";
String url = "jdbc:mysql://localhost/" + dbName + "?user=" + userName
+ "&password=" + userPasswd;
Connection connection = null;
CallableStatement stmt = null;

try {
// 加载数据库驱动程序
Class.forName(driverName).newInstance();
// 连接数据库
connection = DriverManager.getConnection(url);
// 调用存储过程,此存储过程有2个参数
stmt = connection.prepareCall("{call p3(?,?)}");
// 第一个参数是输入的,在此设置第一个参数的值:将第一个参数设置成整数值3
stmt.setInt(1, 3);
// 第二个参数是输出的,在此设置第二个参数的输出类型为VARCHAR
stmt.registerOutParameter(2, Types.VARCHAR);
// 执行存储过程
boolean hadResults = stmt.execute();

// 如果有查询语句的话,此执行过程会返回结果集,在此处理结果集里面的东西
System.out.println("Data from table:");
while (hadResults) {
ResultSet rs = stmt.getResultSet();
while(rs.next()){
String id = rs.getString(1);
String name = rs.getString(2);
System.out.println("ID = "+id+"/tName = " + name);
}
hadResults = stmt.getMoreResults();
}

// 获取存储过程的返回值
System.out.println("/nData from procedure:");
String name = stmt.getString(2); // 获得第二个参数,因为第二个参数是输出类型的
System.out.println("Name = " + name);
} catch (Exception e) {
System.out.println(e.toString());
} finally {
try {
stmt.close();
connection.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}

}

view plaincopy to clipboardprint?
--程序执行结果-- 
Data from table: 
ID = 1 Name = zhang 
ID = 2 Name = zeng 
ID = 3 Name = ming 

Data from procedure: 
Name = ming 
--程序执行结果--
Data from table:
ID = 1 Name = zhang
ID = 2 Name = zeng
ID = 3 Name = ming

Data from procedure:
Name = ming


三、总结

本文中给出最基本的MySQL存储过程的创建以及在Java程序的调用的示例,目的是建立读者对MySQL存储过程以及在程序中使用的大概了解和入门,希望可以对您有所帮助。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics