JDBC之调用存储过程

来源:互联网 发布:pvc地板知乎 编辑:程序博客网 时间:2024/05/20 15:11

1。无参
我们先看预先写好的存储过程:

create procedure p1as select * from studentgo

如何实现JDBC调用无参的存储过程呢?

package a1;import java.sql.*;public class Test05 {    public static void main(String[] args) {        try {            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");            Connection connection = DriverManager.getConnection(""                    + "jdbc:sqlserver://localhost:1433;DatabaseName=tongjunchao","sa","123");;//          CallableStatement cs = connection.prepareCall("p1");            CallableStatement cs = connection.prepareCall("{call p1 }");            //以前是这里面些sql语句,现在因为是调用了存储过程,所以,没有参数了。            ResultSet rSet = cs.executeQuery();            while (rSet.next()) {                String sid = rSet.getString("sid");                String sname = rSet.getString("sname");                String sex = rSet.getString(3);                int age  = rSet.getInt(4);                String tel = rSet.getString("tel");                System.out.println(sid+"\t"+sname+"\t"+sex+"\t"+age+"\t"+tel);            }            //close();            rSet.close();            cs.close();            connection.close();        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (SQLException e) {            e.printStackTrace();        }    }}

运行结果:

sid     sname   sex age  tels001    丰登儿 男   35  13527542451s002    班克尔 女   17  13884233134s003    车笔刀 女   13  15086623248s004    趴耳朵 男   19  15323535256s005    直角  女   23  15653579258s006    扳手  女   19  13663279788s007    俄石板 女   21  13656529396

2.有参数,这里用两个参数做示例

--创建一个存储过程,根据年龄和性别查询学生信息create procedure p3 @age int, @sex varchar(2)as select * from studentwhere age = @age and sex = @sex;go

那么,如何实现JDBC调用带两个参数的存储过程呢?
有两种方法,以下给出的全部代码采用的是推荐的方法!

package a1;import java.sql.*;public class Test05 {    public static void main(String[] args) {        try {            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");            Connection connection = DriverManager.getConnection(""                    + "jdbc:sqlserver://localhost:1433;DatabaseName=tongjunchao","sa","123");;//          CallableStatement cs = connection.prepareCall("p1");            CallableStatement cs = connection.prepareCall("{call p3 (?,?)}");            //以前是这里面些sql语句,现在因为是调用了存储过程,所以,没有参数了。            cs.setString(1, "17");            cs.setString(2, "女");            ResultSet rSet = cs.executeQuery();            while (rSet.next()) {                String sid = rSet.getString("sid");                String sname = rSet.getString("sname");                String sex = rSet.getString(3);                int age  = rSet.getInt(4);                String tel = rSet.getString("tel");                System.out.println(sid+"\t"+sname+"\t"+sex+"\t"+age+"\t"+tel);            }            //close();            rSet.close();            cs.close();            connection.close();        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (SQLException e) {            e.printStackTrace();        }    }}

其中的

CallableStatement cs = connection.prepareCall("{call p3 (?,?)}");            //以前是这里面些sql语句,现在因为是调用了存储过程,所以,没有参数了。            cs.setString(1, "17");            cs.setString(2, "女");

可以替换成:CallableStatement cs = connection.prepareCall("p3 17,'女'");
这也是种不错的简便方式啦
运行结果:

s002    班克尔 女   17  13884233134

3.JDBC调用带有输出的存储过程
创建的存储过程如下:

--根据sid 输出该学生的电话号码create procedure p4@sid varchar(8),@tel varchar(16) outputasselect @tel = tel from studentwhere sid = @sid

示例代码如下:

package a1;import java.sql.*;public class Test05 {    public static void main(String[] args) {        try {            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");            Connection connection = DriverManager.getConnection(""                    + "jdbc:sqlserver://localhost:1433;DatabaseName=tongjunchao","sa","123");;//          CallableStatement cs = connection.prepareCall("p1");            CallableStatement cs = connection.prepareCall("{call p4 (?,?)}");            //以前是这里面些sql语句,现在因为是调用了存储过程,所以,没有参数了。            /**             * 这里我想强调一下的是,下面的操作都是通过CallableStatement              * 的对象调用方法来进行的操作,             * 这样记忆是不是比较简便呢?             * (*^__^*) 嘻嘻             */            cs.setString(1, "s001");            cs.registerOutParameter(2, Types.VARCHAR);            cs.execute();            String string = cs.getString(2);            System.out.println("tel:"+string);            //close();            cs.close();            connection.close();        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (SQLException e) {            e.printStackTrace();        }    }}

运行结果为:

tel:13527542451
1 0