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

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

一、创建MySQL存储过程示例

下面是具体的创建过程:

 

--启动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程序中调用存储过程的程序示例

 

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

 

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


三、总结

本文中给出最基本的MySQL存储过程的创建以及在Java程序的调用的示例,目的是建立读者对MySQL存储过程以及在程序中使用的大概了解和入门,希望可以对您有所帮助。读者可以参考其他的专业书籍对MySQL存储过程进行深入的探讨,本人也会在后续的文章中发表这方面的最新学习成果和大家讨论。

contact me:[email protected]

谢谢!

你可能感兴趣的:(MySQL,mysql,存储,java,数据库驱动程序,string,query)