首页 > 代码库 > jdbc java数据库连接 5)CallableStatement 接口

jdbc java数据库连接 5)CallableStatement 接口

   CallableStatement执行存储过程(也是预编译语言)

 

首先在sql中执行以下带有输入参数的代码:

1       DELIMITER $
2               CREATE PROCEDURE pro_findById(IN sid INT)
3       BEGIN
4               SELECT * FROM person WHERE id = sid;
5       END $

 

那么,这条语句的存储过程代码就是

CALL pro_findById (?);

 

  使用CallableStatement来执行:

 1     /**
 2       带有输入参数的存储语言
 3       sql中先运行
 4       DELIMITER $
 5               CREATE PROCEDURE pro_findById(IN sid INT)
 6       BEGIN
 7               SELECT * FROM person WHERE id = sid;
 8       END $
 9      */
10     private static void testIn() {
11         
12         Connection conn = null;
13         CallableStatement stsm = null;
14         ResultSet rs = null;
15     try{    
16         //1:创建连接
17         conn = Jdbcutil.getConnection();
18         
19         //2:准备sql语言(带有存储过程的预编译语言)
20         String sql = "CALL pro_findById(?);";
21 
22         //3:执行预编译语言
23         stsm = conn.prepareCall(sql);
24         
25         //4:设置参数
26         stsm.setInt(1, 4);
27         
28         //5:发送参数,执行sql(注意:CallableStatement执行sql只有executeQuery()方法)
29         //返回ResultSet对象
30          rs = stsm.executeQuery();
31         
32         //6:遍历,打印出结果
33     while(rs.next()){
34         int id = rs.getInt("id");
35         String name = rs.getString("name");
36         String sex = rs.getString("sex");
37         System.out.println(id+","+name+","+sex);
38          }
39          }
40     catch(Exception e){
41         e.printStackTrace();
42         throw new RuntimeException(e);
43     }
44     //7:关闭连接
45     finally{
46         Jdbcutil.close(conn, stsm, rs);
47     }
48     
49     }

 

 

在sql中执行带有输入参数和输出参数的代码:

DELIMITER $
CREATE PROCEDURE pro_findout(IN sid INT ,OUT sname VARCHAR(20))
BEGIN
    SELECT NAME INTO sname FROM person WHERE id = sid;
END $

这段代码的存储过程代码是:

1 CALL pro_findout(4,@NAME);
2 //预编译语言就是
3 //CALL pro_findout(?,?);

 

使用CallableStatement来执行:

 1 /**
 2          带有输入,输出参数的存储语言
 3          DELIMITER $
 4             CREATE PROCEDURE pro_findout(IN sid INT ,OUT sname VARCHAR(20))
 5         BEGIN
 6             SELECT NAME INTO sname FROM person WHERE id = sid;
 7         END $
 8      */
 9     private static void InAndOut() {
10         
11         Connection conn = null;
12         CallableStatement stsm = null;
13         
14         try{
15             
16             //1:创建连接
17             conn = Jdbcutil.getConnection();
18             
19             //2:创建sql存储语言(预编译)
20             String sql = "CALL pro_findout(?,?)";
21             
22             //3:执行sql预编译语言
23             stsm = conn.prepareCall(sql);
24             
25             //4:设置参数
26             /**
27              * 第一个参数是输入参数
28              * 第二个参数是存储过程中的输出参数的jdbc类型(这里是varchar()) 
29              *                在sql.Types中寻找对应的类型
30              */
31             //4.1:第一个参数的设置
32             stsm.setInt(1, 4);
33             //4.2:第二个参数的设置
34             stsm.registerOutParameter(2,java.sql.Types.VARCHAR);
35             
36             //5:发送参数,执行sql:这个返回的不是ResultSet对象
37             stsm.executeQuery();
38             
39             /**
40              * 6:得到输出参数的值
41              *         根据索引值,也就是预编译sql语言中输出参数的位置
42              */
43             String result = stsm.getString(2);
44             System.out.println(result);    
45         }
46         catch(Exception e){
47             e.printStackTrace();
48             throw new RuntimeException(e);
49         }
50             //7:关闭连接
51         finally{
52             Jdbcutil.close(conn, stsm);
53         }
54         
55 
56     }

 

jdbc java数据库连接 5)CallableStatement 接口