• spring jdbcTemplate 操作存储过程


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

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

    1、存储过程代码:

    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调用该存储过程代码:
    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、存储过程代码:

    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调用该存储过程代码:

    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:

    create or replace package mypackage as
    type my_cursor is ref cursor;
    end mypackage;
    2、存储过程代码:可以看到,列表是通过把游标作为一个out参数来返回的。  
    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调用该存储过程代码:

    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);
    }

    ---------------------
    原文:https://blog.csdn.net/cl05300629/article/details/19325347

  • 相关阅读:
    实数的构造
    实数的构造
    某曲线上的点到两点距离和最小的问题都可以用做椭圆解决
    Java 性能优化之 String 篇
    使用 Spring Data JPA 简化 JPA 开发
    使用 Sonar 进行代码质量管理
    Servlet运行周期与原理流程
    使用 Java 配置进行 Spring bean 管理
    通过日志监控并收集 Java 应用程序性能数据
    基于 JUnit 的全局单元测试程序
  • 原文地址:https://www.cnblogs.com/JAYIT/p/10044607.html
Copyright © 2020-2023  润新知