Java学习笔记2-JDBC存储过程

最近只是简单的学习了一下存储过程,梳理一下知识点。
大家可以在慕课网上面找到相应的教程视频,这里有一篇博客:
王者佳暮的博客
http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
大家可以找到更多详细内容关于存储搓成,比如变量,语句,创建等等,感谢前辈们的帮助和分享。

言归正传,上次我简单的整理了无参的存储过程的调用,今天我们详细介绍一下无参,入参,出参三种存储过程以及JDBC的调用过程。我使用的是MySQL, Navicat for MySQL,下面的例子都是在MySQL上进行的。

1. MySQL 存储过程的创建:
CREATE PROCEDURE name (IN/OUT/INOUT param TYPE, …)
这里一共有三种参数类型,IN, OUT, INOUT. 其中:
IN 输入参数, 举个例子:
SELECT * FROM people_table WHERE name = ?;
这里的就是你需要输入的参数,该参数在调用存储过程是指定。
OUT输出参数,举个例之:
SELECT COUNT(*) INTO count FROM people_table;
这里的count就是输出参数,这条SQL语句是查询表中记录的数目并返回count值。其中count就作为SQL语句的输出参数返回。
INOUT 输入输出参数: 调用时指定,并且可被改变和返回。

在MySQL命令行下创建存储过程:
a. 无参存储过程:

mysql> DELIMITER //
mysql> CREATE PROCEDURE demo_name
     > BEGIN
     >     select * from people_table;
     > END;
     > //
mysql> DELIMITER ;

执行过程:

mysql> call demo_name;

其中DELIMITER // 和DEMILITER ;两句是用来声明分隔符,具体内容可以参见王者佳暮的博客,我是在那里学来的。

b. 入参存储过程:

mysql> DELIMITER //
mysql> CREATE PROCEDURE demo_name(IN sp_name VARCHAR(20))
     > BEGIN
     >     select * from people_table where name = sp_name;
     > END;
     > //
mysql> DELIMITER ;

执行过程:

mysql> set @sp_name = "Nancy"
mysql> call demo_name(@sp_name);

c. 出参存储过程:

mysql> DELIMITER //
mysql> CREATE PROCEDURE demo_name(OUT count int)
     > BEGIN
     >     select count(*) into count from people_table;
     > END;
     > //
mysql> DELIMITER ;

执行过程:

mysql> set @count = 0;
mysql> call demo_name;
mysql> select @count;

以上是在MySQL命令行下创建存储过程,语法结构都比较简单,可以在网上找到更多资源,这里只是入门介绍。

在Navicat for MySQL图形界面下面创建存储过程:
a. 右键function,新建procedure

右键function,新建procedure

选择procedure

b. 设置参数类型,IN,OUT,INOUT

设置参数类型 IN OUT INOUT

c. 编写procedure(注意修改下面的参数类型,有时候可能会有错误)

编写procedure

d. 保存执行

设置参数,并执行

这里我们就创建好了存储过程。

2. JDBC调用存储过程:
上次我们简单的讲过无参存储过程的调用,JDBC的调用过程基本一致。
a. 无参存储过程调用:

public static void select_nofilter() throws SQLException{
        //1.获得链接
        Connection conn = DBUtil.getConnection();
        //2.获得callablestatement
        CallableStatement cs = conn.prepareCall("call sp_select_nofilter()");
        //3.执行存储过程
        cs.execute();
        //4. 处理返回的结果: 1. 结果集
        ResultSet rs = cs.getResultSet();
        while(rs.next()){
            System.out.println(rs.getString("name"));
        }
    }

b.入参存储过程调用:

public static List<Person> select_filter(String sp_name) throws Exception {

        List<Person> ps = new ArrayList<Person>();
        Person p = null;
        //1.获得链接
        Connection conn = DBUtil.getConnection();
        //2.获得callablestatement
        CallableStatement cs = conn.prepareCall("call select_by_name(?)");
        //设置入参
        cs.setString(1, sp_name);
        //3.执行存储过程
        cs.execute();
        //4. 处理返回的结果: 1. 结果集
        ResultSet rs = cs.getResultSet();
        while(rs.next()){
            p = new Person();
            p.setAge(rs.getInt("age"));
            p.setGender(rs.getString("gender"));
            p.setID(rs.getInt("id"));
            p.setName(rs.getString("name"));
            ps.add(p);
        }
        return ps;
    }

c. 出参存储过程调用:

public static Integer select_count() throws Exception{
        Integer count = 0;
        //1.获得链接
        Connection conn = DBUtil.getConnection();
        //2.获得callablestatement
        CallableStatement cs = conn.prepareCall("call select_count_2(?)");
        //设置出参
        cs.registerOutParameter(1, Types.INTEGER);
        //3.执行存储过程
        cs.execute();
        //4. 处理:出参
        count = cs.getInt(1);
        return count;
    }

大家可以看到,三种存储过程的调用基本相同,唯一的不同之处在于参数的设置,注意设置入参和出参的代码,以及获取出参的代码。

3. 其他内容
以上就是存储过程基本的创建和调用,还有一些只是,包括变量的声明,存储过程的修改和删除,都可以在网上找到相应的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值