Spring如何使用JdbcTemplate调用存储过程的三种情况

Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用JdbcTemplate调用Oracle存储过程的三种情况: 

一、无返回值的存储过程调用 

1、存储过程代码:

?
1
2
3
4
create or replace procedure sp_insert_table(param1  in varchar2,param2  in varchar2)  as    
    begin   
        insert into table MyTable (id, name values ( 'param1 ' , 'param2' );   
    end sp_insert_table;

2、JdbcTemplate调用该存储过程代码:
?
1
2
3
4
5
6
7
8
9
10
11
package com.dragon.test;    
import org.springframework.jdbc.core.JdbcTemplate;    
public class JdbcTemplateTest {    
   private JdbcTemplate jdbcTemplate;    
   public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {    
   this .jdbcTemplate = jdbcTemplate;    
   }    
   public void test(){    
      this .jdbcTemplate.execute( "call sp_insert_table('100001')" );    
   }    
}

 

二、有返回值的存储过程(非结果集)

1、存储过程代码:

?
1
2
3
create or replace procedure sp_select_table (param1  in varchar2,param2  out varchar2)  as    
  begin select into param2  from MyTable  where ID = param1 ;  
end sp_insert_table ;

2、JdbcTemplate调用该存储过程代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void test() {  
   String param2Value = (String) jdbcTemplate.execute(  
      new CallableStatementCreator() {  
         public CallableStatement createCallableStatement(Connection con)  throws SQLException {  
            String storedProc =  "{call sp_select_table (?,?)}" ; // 调用的sql  
            CallableStatement cs = con.prepareCall(storedProc);  
            cs.setString( 1 "p1" ); // 设置输入参数的值  
            cs.registerOutParameter( 2 ,OracleTypes.Varchar); // 注册输出参数的类型  
            return cs;  
         }  
      },  new CallableStatementCallback() {  
          public Object doInCallableStatement(CallableStatement cs)  throws SQLException, DataAccessException {  
            cs.execute();  
            return cs.getString( 2 ); // 获取输出参数的值  
      }  
   });  
}

三、有返回值的存储过程(结果集)

1、存储过程代码:先创建程序包,因为Oracle存储过程所有返回值都是通过out参数返回的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用package:

?
1
2
3
create or replace package mypackage  as 
     type my_cursor  is ref  cursor
     end mypackage;
2、 存储过程代码:可以看到,列表是通过把游标作为一个out参数来返回的。  
?
1
2
3
4
create or replace procedure sp_list_table(param1  in varchar2,param2  out mypackage.my_cursor)  is 
     begin 
     open my_cursor  for select from myTable; 
     end sp_list_table;

3、JdbcTemplate调用该存储过程代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public void test() {  
   List resultList = (List) jdbcTemplate.execute(  
      new CallableStatementCreator() {  
         public CallableStatement createCallableStatement(Connection con)  throws SQLException {  
            String storedProc =  "{call sp_list_table(?,?)}" ; // 调用的sql  
            CallableStatement cs = con.prepareCall(storedProc);  
            cs.setString( 1 "p1" ); // 设置输入参数的值  
            cs.registerOutParameter( 2 , OracleTypes.CURSOR); // 注册输出参数的类型  
            return cs;  
         }  
      },  new CallableStatementCallback() {  
         public Object doInCallableStatement(CallableStatement cs)  throws SQLException,DataAccessException {  
            List resultsMap =  new ArrayList();  
            cs.execute();  
            ResultSet rs = (ResultSet) cs.getObject( 2 ); // 获取游标一行的值  
            while (rs.next()) { // 转换每行的返回值到Map中  
               Map rowMap =  new HashMap();  
               rowMap.put( "id" , rs.getString( "id" ));  
               rowMap.put( "name" , rs.getString( "name" ));  
               resultsMap.add(rowMap);  
            }  
            rs.close();  
            return resultsMap;  
         }  
   });  
   for ( int i =  0 ; i < resultList.size(); i++) {  
      Map rowMap = (Map) resultList.get(i);  
      String id = rowMap.get( "id" ).toString();  
      String name = rowMap.get( "name" ).toString();  
      System.out.println( "id=" + id +  ";name=" + name);  
   }  
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值