遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的。

参考网络中的方法,在实际操作中遇到两个问题:

1 存储过程的参数问题 ,原本以为只要传对应的入参就可以,即每个入参占用一个?,在报错后检查发现,出参也要占用一个?;

2连接数据库,这个是开始没有注意,但很快就发现了。

完成这个存储过程调用的代码

int  param2Value = (Integer ) jdbcTemplate.execute(new CallableStatementCreator()
        {
            public CallableStatement createCallableStatement(Connection con) throws SQLException
            {
                String storedProc = sql;// 调用的sql   
                CallableStatement cs = con.prepareCall(storedProc);
                cs.setString(1, obj[0] + "");
                cs.setInt(2, Integer.parseInt(obj[1] + ""));
                cs.setString(3, obj[2] + "");
                cs.setString(4, obj[3] + "");
                cs.setString(5, obj[4] + "");
                cs.setInt(6, Integer.parseInt(obj[5] + ""));
                cs.setLong(7, Long.parseLong(obj[6] + "") );
                // 注册输出参数的类型      
                cs.registerOutParameter(8, OracleTypes.NUMBER);
                return cs;
            }
        }, new CallableStatementCallback()
        {
            public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException
            {
                cs.execute();
                return cs.getInt(8);// 获取输出参数的值   
            }
        });
      return param2Value;
      }
      catch (Exception e)
      {
          e.printStackTrace();
          return -1;
      }

trycatch 非必须的。

其中 jdbcTemplate要设置其获取oracle数据库的连接,也就是读取配置。

private JdbcTemplate jdbcTemplate;
 
    /**
     * 设置数据源
     * @param  dataSource       数据源对象
     * @return void             无返回对象
     * @author 邹建松 2014-07-14
     */
    @Resource(name="baseDataSource")
    public void setJdbcTemplate(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

baseDataSource 是配置文件xml里的

以上是有返回参数,即是有出参数的。

没有出参的如下

public void test(){   
        try
        {
            this.jdbcTemplate.execute("call p_create_student_test('123')");    
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
            
          }

还有一种情况就是有结果集的,这种我还没有用过,参考网络的

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

还有就是用别的方法调用存储过程,如

public void updateStudentIncludeType(User bean) {
        Connection con = getConnection();
        CallableStatement csmt = null;
        Student student = (Student) bean.getDetails();
        try {
            /*
             * v_student_id in number,--学生ID v_student_name in varchar,--学生姓名
             * v_sex in number,--性别 v_student_no in number,--学号 v_duty in
             * varchar,--职务 v_phonenumber in varchar,--联系电话 v_school_org_id in
             * number,--组织ID v_school_org in number,--组织 v_card_id in
             * varchar,--考勤卡号
             */
            csmt = con.prepareCall("{CALL P_MODIFY_STUDENT_AND_TYPE(?,?,?,?,?,?,?,?,?,?,?)}");
            csmt.setLong(1, student.getUserId());
            csmt.setString(2, student.getStudentName());
            csmt.setLong(3, student.getSex());
            csmt.setString(4, student.getStudentNo());
            csmt.setString(5, student.getDuty());
            csmt.setString(6, student.getLinkDn());
            csmt.setLong(7, student.getOrgId());
            csmt.setLong(8, Long.parseLong(student.getSchool_id()));
            csmt.setString(9, student.getCard());
            csmt.setInt(10, student.getStudentType());
            csmt.registerOutParameter(11, Types.INTEGER);
            csmt.executeUpdate();
            if (csmt.getInt(11) == 1) {
                throw new DaoException("修改学生信息失败!");
            }
            if (csmt.getInt(11) == 2) {
                throw new DaoException("考勤卡号重复,请重输!");
            }
            if (csmt.getInt(11) == 3) {
                throw new DaoException("学生学号重复,请重输!");
            }
        } catch (SQLException e) {
            throw new DaoException("系统维护中,请稍后再试!", e);
        } finally {
            JdbcUtils.closeStatement(csmt);
            closeConnectionIfNecessary(con);
        }
        
    }

用到jar包

Spring JdbcTemplate 调用存储过程的更多相关文章

  1. spring jdbctemplate调用存储过程,返回list对象

    注:本文来源于<  spring jdbctemplate调用存储过程,返回list对象 > spring jdbctemplate调用存储过程,返回list对象 方法: /** * 调用 ...

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

    注:原文 <Spring如何使用JdbcTemplate调用存储过程的三种情况 > Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用Jdbc ...

  3. jdbcTemplate 调用存储过程。 入参 array 返回 cursor

    注:本文来源<   jdbcTemplate 调用存储过程. 入参 array 返回 cursor   > 需求: java传入一个list object.从数据库找到相关的数据并返回. ...

  4. Spring JDBC调用存储过程

    以下示例将演示spring jdbc如何调用存储过程.将通过调用存储过程来读取Student表中的一个可用记录.将传递一个学生ID并获取学生记录信息. 语法: SimpleJdbcCall jdbcC ...

  5. spring jdbcTemplate 操作存储过程

    Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用JdbcTemplate调用Oracle存储过程的三种情况: 一.无返回值的存储过程调用 1.存储过程代 ...

  6. 解决Spring JdbcTemplate调用queryForObject()方法结果集为空时报异常

    JdbcTemplate用的时候发现一个问题:调用queryForObject()方法,如果没有查到东西则会抛一个异常:org.springframework.dao.EmptyResultDataA ...

  7. spring heibernate 调用存储过程

    一:参考网址 http://sunbin123.iteye.com/blog/1007556 二:示例 @Autowired @Qualifier("jdbcTemplate") ...

  8. spring jdbctemplate调用procedure(返回游标)

    package cn.com.git.htsc.uac.core.repository.report; import cn.com.git.htsc.uac.core.api.dto.report.R ...

  9. jdbctemplate 调用oracle 有返回(会话型临时表数据的)结果的存储过程

    注:本文为博主 原创. jdbctemplate 调用oracle存储过程 事务 临时表  有返回结果 1:java 代码 本逻辑代码本是想把 java 代码里的list<Strign>类 ...

随机推荐

  1. MFC控件的SubclassDlgItem

    MFC控件的SubclassDlgItem 要在程序中创建新设计的控件,显然不能用自动创建的办法,因为对话框模板对新控件的特性一无所知.程序可以用手工方法创建控件,在调用派生类的Create函数时,派 ...

  2. CRM域用户误删恢复

    记录一下: 不小心将CRM用户在域中删除了(CRM中未删除),直接新建一个同样账号的域用户然后尝试在CRM中登录报“invalid user”错误,一番检查发现从2011版本开始CRM中不单记录了用户 ...

  3. Servlet学习三——传输文件

    最先在考虑传输文件时,想通过java写一个文件上传案例,传给Servlet,Servlet再保存至数据库中,但苦于一直没找到实例,听说Flex有实际的例子,就直接用Flex例子来测试了.本文的顺序为: ...

  4. 笔记19-徐 如何在超大型数据库上运行DBCC CHECKDB

    ) --以上方法TB级数据库的DBA可以考虑试试

  5. 全面的Seo面试题

      一.选择题(每题2分,2分×10=20分) 1.白帽SEO诞生日是: A .1997年9月15日 :B .2004年12月13日:C.2005年3月26日:D.2009年6月1日 2.一个做女性服 ...

  6. C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

    使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...

  7. Html+Ajax+Springmvc+Mybatis,不用JSP

    有一个原因如下很合本人观点: http://bbs.csdn.net/topics/390939813 前端使用HTML+Ajax,后端使用Java Servlet,这样完全可以做到前后端分离,前端那 ...

  8. Android背景渐变色(shape,gradient)

    Android设置背景色可以通过在res/drawable里定义一个xml,如下: <?xml version="1.0" encoding="utf-8" ...

  9. javac 命令出现 找不到文件 问题及解决办法

    如果环境配置好了,使用java -version回车可以正常查看到版本信息. 使用javac Demo.java 如果提示文件找不到 可能原因1: 源文件与当前命令行不在同目录下,这时候就要切换到同一 ...

  10. linux 开机自添加路由

    进入 vi /etc/sysconfig/network/routes Destination     Gateway            Genmask         Use Iface172. ...