mysql 存储过程

来源:互联网 发布:淘宝退款售后订单删除 编辑:程序博客网 时间:2024/06/05 19:25

存储过程有什么作用?
存储过程可以封装一段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);        }    }
0 0
原创粉丝点击