本文已转到我的博客空间 明月工做室http://www.freebytes.net/it/database/mysql-cunchu.htmlhtml
存储过程 Procedure 是一组为了完成特定功能的 SQL 语句集合,经编译后存储在数据库中,用户经过指定存储过程的名称并给出参数来执行。存储过程当中能够包含逻辑控制语句和数据操纵语句,它能够接受参数、输出参数、返回单个或多个结果集以及返回值。java
以上是官方的定义。简单来讲,若是把sql当成是代码,其实存储过程就至关于函数。把一组具有特定功能的sql语句封装成起来而已。因此他的本质是为了更好的执行对数据库的操做。那么好在哪里呢?mysql
1. 性能。存储过程在建立时就已经在数据库服务器中编译好并存储起来,调用时只需提供过程名和参数,就能够直接使用。而sql语句,没执行一句就要编译一次,这在sql语句发送并不频繁的状况下还好,可是若是短期大量发送sql语句的状况下,不只会下降网络性能也会增长数据库负担。sql
2. 可完成更复杂的数据库控制。因为存储过程当中能够包含逻辑控制语句和数据操纵语句,相似遍历、if这种逻辑能够直接卸载过程当中。数据库
3.我在程序中写了一段代码,发送一千条sql插入语句到本地数据库,大概花了6672ms,而在存储过程当中只花了4689ms。如下分别是代码和存储过程sql:服务器
@Autowired private JdbcTemplate jdbcTemplate; public static final String INSERT_SQL="insert into user (id, name, age) values(?,?,?)"; public void insert(){ long begin = System.currentTimeMillis(); for (int i = 600000; i < 601000; i++) { jdbcTemplate.update(INSERT_SQL,i,"林"+i,10+Math.random()*10); } long end = System.currentTimeMillis(); System.out.println(end-begin); }
CREATE PROCEDURE test_insert2 () BEGIN DECLARE i INT DEFAULT 601000; WHILE i<602000 DO insert into `user` (id,NAME,age) values (i,CONCAT('林',i),18); SET i=i+1; END WHILE; COMMIT; END; CALL test_insert2()
1. delimiter // 该语句指定MySQL把“//”看成分隔符。也就是说,若是你在MySQL client中输入这句,则“;”符号再也不被看成结束符。网络
2. create procedure getAllUser() 表示建立存储过程,其名为getAllUser()。dom
3. call getAllUser ; 调用存储过程getAllUser。函数
4. drop procedure getAllUser; 删除存储过程。性能
5. begin...end 之间编写过程体,即写sql语句和逻辑代码。
6. 存储过程根据须要可能会有输入、输出、输入输出参数,若是有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:
最后输入 还原分隔符为 “;”
调用过程
删除过程
右键新建函数,选择过程
在这里写逻辑语句吧,完整以下:
BEGIN DECLARE i INT DEFAULT initValue; WHILE i<=endValue DO insert into `user` (id,NAME,age) values (i,CONCAT('林',i),18); SET i=i+1; END WHILE; COMMIT; END
这里的意思是 把第一个参数赋给变量i,当i小于第二个参数值时,一直进行while循环,每次循环i+1。
Navicat里面点击sql预览能够看到完整的代码:
按下ctrl+s保存:
而后运行,输入两个参数,逗号隔开:
就能够插入数据了。
@Autowired private DataSource dataSource; public List<User> getUser() { List<User> users = new ArrayList<User>(10000); User user = new User(); try { CallableStatement callableStatement = dataSource.getConnection().prepareCall("{call getUser}"); ResultSet rs = null; //执行查询操做,并获取结果集 rs = callableStatement.executeQuery(); while (rs.next()){ user.setName(rs.getString("name")); user.setAge(rs.getInt("age")); user.setId(rs.getInt("id")); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } return users; }
调用一个getUser()的存储过程,并将结果封装成实体。主要是 CallableStatement callableStatement = dataSource.getConnection().prepareCall("{call getUser}");这句代码。这里我认为应该有更成熟的调用方式才对,可是我也懒得找资料了。反正原理都同样。
mysql的自定义函数其实就是咱们本身去定义相似sum(...)、max(...)这种函数,很简单,建立起来跟存储过程差很少,就很少作讲解了。
create function sum1(x int,y int) returns int(20)
begin
//编写函数体
return xxx ;
end ;
使用 select sum1(215,555)
删除 drop sum1