存储过程有什么作用?
存储过程可以封装一段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);
}
}