来源:自学PHP网 时间:2015-04-16 10:51 作者: 阅读:次
[导读] 一、MySQL数据库存储过程: 1、什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集。存储过...
一、MySQL数据库存储过程: 1、什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集。存储过程经编译存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 2、与一般SQL语句相比,使用存储过程有哪些优点,有哪些缺点 优点: 3、怎样创建存储过程及创建存储过程需要注意的地方 存储过程的创建格式为: create procedure 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...]) 创建存储过程的具体例子见下面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 $$//<span style="font-family: Arial, Helvetica, sans-serif;">DELIMITER和$$之间要么没有空格要么只有一个空格,如果有多个空格,在执行创建存储过程语句时你会发现这样是不能创建成功的</span> 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 { Connection connection = LinkDB.getMySqlConnection(); String proStr = "{call outTwoParam(?,?)}"; CallableStatement callableStatement = connection.prepareCall(proStr); callableStatement.registerOutParameter(1, Types.VARCHAR); callableStatement.registerOutParameter(2, Types.DECIMAL); callableStatement.execute(); String fruitName = callableStatement.getString(1); double fruitPrice = callableStatement.getDouble(2);// 获取DECIMAL类型的属性要使用getDouble方法。 System.out.println("水果名称:" + fruitName +"、水果价格:" + fruitPrice + "元"); LinkDB.close(connection, callableStatement, null); } } 4、含有一个输入参数和一个输出参数的存储过程 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 inOneParamAndOutOneParam(IN fruitName VARCHAR(12),OUT fruitPrice DECIMAL(7,3)) BEGIN SELECT price FROM fruit WHERE NAME=fruitName INTO fruitPrice; END $$ DELIMITER ; */ /** * 含有一个输入参数和一个输出参数的存储过程 * * @author GaoHuanjie */ public class InOneParamAndOutOneParam { public static void main(String args[]) throws SQLException { Connection connection=LinkDB.getMySqlConnection(); CallableStatement callableStatement=null; String procStr="{call inOneParamAndOutOneParam(?,?)}"; callableStatement=connection.prepareCall(procStr); String fruitName = "莲雾"; callableStatement.setString(1, fruitName); callableStatement.registerOutParameter(2, Types.DECIMAL); callableStatement.execute(); double fruitPrice=callableStatement.getDouble(2);//获取DECIMAL类型的属性要使用getDouble方法。 System.out.println(fruitName+"的价格为:"+fruitPrice+"元"); LinkDB.close(connection, callableStatement, null); } } 5、输入参数即输出参数的存储过程 package com.ghj.packageoftest; import java.sql.*; import com.ghj.packageoftool.LinkDB; /* 运行本程序前需执行的脚本: DELIMITER $$ CREATE PROCEDURE inOneParamISOutOneParam(INOUT fruitName VARCHAR(12)) BEGIN SELECT NAME INTO fruitName FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') LIMIT 0,1; END $$ DELIMITER ; 或 DELIMITER $$ CREATE PROCEDURE inOneParamISOutOneParam(INOUT fruitName VARCHAR(12)) BEGIN SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') LIMIT 0,1 INTO fruitName; END $$ DELIMITER ; 注意上面查询语句不能这样写:SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') INTO fruitName LIMIT 0,1; 注意:对比3、4和5Java文件内创建存储过程脚本中“INTO”关键字的位置你一定深有收获,呵呵呵,偷点懒,在此就不总结了。 */ /** * 输入参数即输出参数的存储过程 * * @author GaoHuanjie */ public class InOneParamISOutOneParam { public static void main(String args[]) throws SQLException { Connection con = LinkDB.getMySqlConnection(); CallableStatement callableStatement = null; String procStr = "{call inOneParamISOutOneParam(?)}"; callableStatement = con.prepareCall(procStr); callableStatement.setString(1, "莲"); callableStatement.registerOutParameter(1, Types.VARCHAR); callableStatement.execute(); String fruitName = callableStatement.getString(1); System.out.println("表中水果名称含有‘莲’字的一中水果的名称是:" + fruitName); LinkDB.close(con, callableStatement, null); } } 说明: 1、如果把上面代码拷贝下来你会发现缺少LinkDB类,现贴出该类: package com.ghj.packageoftool; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 连接数据库 * * @author GaoHuanjie */ public class LinkDB { /** * 功能:获取与MySql的连接 * * @author GaoHuanjie */ public static Connection getMySqlConnection() { Connection connection = null; String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String pwd = ""; 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; } /** * 关闭释放所有的资源 * * @author GaoHuanjie */ public static void close(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(); } } } } 2、如果执行创建存储过程的SQL脚本,你会发现缺少名为fruit类,现贴出创建该表的SQL语句: CREATE DATABASE `test`; USE `test`; CREATE TABLE `fruit` ( `id` char(36) NOT NULL COMMENT '标识', `name` varchar(12) NOT NULL COMMENT '名称', `price` decimal(8,2) NOT NULL COMMENT '单价', `address` varchar(300) DEFAULT NULL COMMENT '产地', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='水果表'; insert into `fruit`(`id`,`name`,`price`,`address`) values ('27640c30-8df5-4cf2-916e-c28e0b2b1b52','山竹','24.45','马来西亚'), ('46ac8392-9922-4593-89a3-517a9e516733','菠萝','19.41','巴西'), ('63061a9f-3a0e-4140-98e0-8b1e13e4eab3','哈密瓜','17.77','中国'), ('7ef0c286-b8b1-4e1e-9a8a-36bce703cf18','鳄梨','30.80','墨西哥'), ('a1cf5251-9311-4c7f-be10-3532d8c16291','树莓','117.50','瑞士'), ('c397aed0-a39a-49c5-91ee-7fc0579ddb20','莲雾','77.33','印度尼西亚'), ('e8068fa1-a8e7-4025-89e2-36c1d5d23c74','榴莲','16.50','泰国'); 【0分下载演示资源】 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com