mysql 存储过程

存储过程有什么作用?
存储过程可以封装一段sql语句,类似于程序中函数的作用。预先布置好一系列的sql处理。

存储过程有什么好处?
mysql在执行sql语句的时候会先将该sql语句进行编译处理,编译后才会去执行。而将sql保存到存储过程中,存储过程在创建的时候就会去编译该sql语句,然后调用该存储过程,存储过程里面的sql就不会被编译了,而是直接运行,所以少了再编译这一步提升了mysql执行效率。如果我们有一段或多段sql语句需要执行且sql语句的结构比较复杂,那么我们就可以将该sql封装到存储过程中以提高sql运行的效率。

存储过程怎么使用?
创建一个存储过程
create procedure ‘存储过程名称’(in in_element type, out out_element type)
begin

end

其中括号里面的参数是可选参数。第一个参数是调用该存储过程需要传入什么类型(type)的参数(in_element),第二个参数是调用该存储过程后该存储过程会返回一个什么类型(type)的参数(out_element)
所有的sql语句都将包含到begin end 之间。

以下示例
create procedure getStudent(in student_id int(11))
begin
select * from user where sid=student_id;
end
然后执行。
在程序中每次调用的方法为 call getStudent(130042101); 诸如此例的形式调用该存储过程。
在java中调用存储过程的形式在Connection 对象下的prepareCall(),我们常用的prepareStatement 是预处理sql语句,而prepareCall 就是预处理存储过程。
java 示例

	/**
	 * 调用存储过程
	 * @param
	 * String callFunc 存储过程名
	 * @return
	 * List<Map<String,String>> 产生的结果集 为空则为没有返回结果
	 * */
	public List<Map<String,String>> callResult(String callFunc,List<DataType> keyVal)
	{
		String call = "{call " + callFunc + "}";
		
		ResultSetMetaData meta = null;
		CallableStatement callableStatement= null;
		ResultSet result = null;
		
		try{
			callableStatement = conn.prepareCall(call);
			
			if(keyVal != null)
			{
				for(int i=1;i<=keyVal.size();i++)
				{
					DataType data = keyVal.get(i-1);
					
					switch(data.getType())
					{
						case ValueTypeSource.STRING:
							callableStatement.setString(i, String.valueOf(data.getValue()));
						break;
						
						case ValueTypeSource.INT:
							callableStatement.setInt(i, Integer.valueOf(data.getValue()));
						break;
						 																																																																																									
						case ValueTypeSource.LONG:
							callableStatement.setLong(i, Long.valueOf(data.getValue()));
						break;
						
						case ValueTypeSource.DOUBLE:
							callableStatement.setDouble(i, Double.valueOf(data.getValue()));
						break;
						
						default:
							callableStatement.setString(i,String.valueOf(data.getValue()));
					}
				}
			}
			
			callableStatement.execute();
			
			result = callableStatement.getResultSet();
			
			meta = result.getMetaData();
			
			result.last();
			
			List<Map<String,String>> list = new ArrayList<Map<String,String>>(result.getRow());
			
			result.first();
			
			int propertiesLength = meta.getColumnCount();
			
			do{
				Map<String,String> map = new HashMap<String,String>(propertiesLength);
				
				for(int i=1;i<=propertiesLength;i++)
				{
					String keyName = meta.getColumnName(i);
					
					map.put(keyName, result.getString(keyName));
				}
				
				list.add(map);
			}while(result.next());
			
			return list;
		}catch(SQLException e)
		{
			e.printStackTrace();
			
			return null;
		}finally{
			closeCallableStatement(callableStatement);
			closeResultSet(result);
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值