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); } }
- 【mysql】mysql存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- MySQL存储过程详解 mysql 存储过程
- 安卓常用调试工具
- Android滚动截屏,ScrollView截屏,Listview截屏,Recyclerview截屏
- QT 的信号与槽机制介绍
- 基于TCP/IP和UDP的socket编程
- 视频
- mysql 存储过程
- eval 的作用
- Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)
- Android面试题-为什么需要token
- 中小站做SEO,就是安全第一,安全第一,安全第一
- Android路由表设置(route & DNS)
- Centos 端口转发
- java用正则方法验证文件名是否合法
- BZOJ3482: [COCI2013]hiperprostor