当前位置: 代码迷 >> MySQL >> mysql存储过程拓荒
  详细解决方案

mysql存储过程拓荒

热度:162   发布时间:2016-05-05 16:37:21.0
mysql存储过程开荒

存储过程可以一次执行多条语句,处理复杂的业务逻辑,完成一些计算。
这篇博客总结一下mysql中存储过程基本的用法——mysql存储过程开荒。我们从怎么写存储过程和怎么调用两方面来探讨下:

一、mysql中存储过程的用法

注意下面的示例可以在mysql管理工具中(我用的navicat)直接运行,如果要在mysql客户端(dos窗口)需要加 delimiter$$ 分隔符。


首先来看第一个例子:
这个存储过程有两个int类型的输入参数,一个varchar类型的输出参数
在begin和end之前执行数据库操作或是计算,
用declare声明了一个int类型的变量,
后面是一个if 判断,注意后面需要有then 和end if,这才是完整的if判断
select语句进行输出,可以直接用select ‘*’输出,或是用as 添加一个列名
存储过程写好编译无误后,用call调用,这里需要一个输出参数,[email protected]_in变量

use etoak;drop procedure if exists t1;create procedure t1(in a int,in b int,out d varchar(30))begin   declare c int;   if a is null then      set a = 0;   end if;   if b is null then      set b = 0;   end if;   set c = a + b;  /* select c as sum;*/        select 's' into d;        select d as '哈哈';    -- 输出一列end;/*调用存储过程*/set @p_in = 1;call t1(10,1,@p_in);

上面我们使用if then条件判断,下面来看使用case when来完成更多的条件:

drop procedure if exists t1;create procedure t1(in a int,in b int,out c varchar(30))begin    declare d int;    set d = a+1;    case d        when 1 then insert into student values(null,'dx',11,now());        when 2 then insert into student values(null,'aa',11,now());        else insert into student values(null,'bb',11,now());    end case;    select * from student;end;

再来看两个循环,一个是while do循环,一个是loop循环:

/*使用while do循环*/create procedure t1()begin    declare i int DEFAULT 0;    while i<5 DO            insert into student(name) values(i);        set i=i+1;    end while;    select * from student;end;/*使用loop循环*/drop procedure if exists t1;create procedure t1()begin    declare i int DEFAULT 0;    loop_label:LOOP         if i = 3 THEN                   set i = i + 1;            ITERATE loop_label;    -- iterate相当于java循环里的continue        end if;        insert into student values(null,i,i,now());        set i = i + 1;        if i >= 5 THEN                  leave loop_label;        end if;    end loop;    select * from student;end;

还有比较常用的模糊查询:

/*模糊查询*/drop procedure if exists t1;create procedure t1(in a varchar(30),out c varchar(30))begin    declare d int;        select * from student where name like concat('%',a,'%');end;

这个例子中要注意的是使用了concat拼接字符串函数。

二、在java代码中如何调用存储过程

通过上面我们知道可以在mysql客户端里面通过call调用存储过程,那在java代码里面又是如何调用的呢
我们来看下下面的例子,使用jdbc的方式调用带输入输出参数的存储过程:
存储过程为如下,实现简单的加法:

create procedure t1(in a int,in b int,out d int)begin   declare c int;   if a is null then      set a = 0;   end if;   if b is null then      set b = 0;   end if;   set c = a + b;     select c into d;end;

java中通过jdbc调用:

import java.sql.CallableStatement;import java.sql.Connection;import java.sql.SQLException;import java.sql.Types;public class TestProc {    public static void main(String[] args) throws SQLException {        TestProc tp = new TestProc();        int a = tp.testPro(5, 6);        System.out.println(a); //打印输出值    }    //获取数据库连接    private static DBConnection dbConnection=null;    static {        if (null == dbConnection) {            dbConnection = new DBConnection();         }    }     //执行存储过程的方法    public int testPro(int a,int b) throws SQLException{        Connection conn = null;        CallableStatement stmt = null;        int out = 0;        String sql="";        try {            conn = dbConnection.getConnection();            stmt = conn.prepareCall("{call t1(?,?,?) }");            stmt.setInt(1, a);            stmt.setInt(2, b);            stmt.registerOutParameter(3, Types.INTEGER);            stmt.execute();            out = stmt.getInt(3);  //这里获取下输出参数        }finally {            dbConnection.close(conn);            dbConnection.close(stmt);        }         return out;    }}

mybatis中存储过程的调用:

声明接口:

public Map proc(Map map);

xml:

<select id="proc" parameterType="map" statementType="CALLABLE">        {call t1(            #{firstParam,jdbcType=INTEGER,mode=IN},            #{secondParam,jdbcType=INTEGER,mode=IN},            #{outParam,jdbcType=INTEGER,mode=OUT}        )}    </select>

测试:

Map map = new HashMap();        map.put("firstParam",1);        map.put("second", 2);        bi.proc(map);        System.out.println(map.toString());

这里注意一下:
mybatis的入参map里面不需要put输出参数,执行完存储过程之后,会自动把输出参数放到map里面。所以我们的打印结果如下:

{second=2, firstParam=1, outParam=1}

版权声明:本文为博主原创文章,未经博主允许不得转载。

1楼u0112508511小时前
上面最后一个mybatis的有点错误,但执行结果是对的。map里面第二个参数应该是secondParam。这里写错了 ,所以这个值就是0,输出1,写对的话输出就是3了。
  相关解决方案