spring中调用存储过程

springframework.jdbc.object.StoredProcedure是对应存储过程调用的操作对象,它通过其父类org.springframework.jdbc.object.SqlCall获得相应的底层API支持(CallableStatementCreator),然后在此基础之上构建了调用存储过程的执行方法。

StoredProcedure是抽象类,所以需要实现相应子类以封装对特定存储过程的调用,还记得我们在讲解JdbcTemplate调用存储过程时候定义的存储过程吗?

CREATE PROCEDURE CountTable(IN tableName varchar(1000),OUT sqlStr varchar(1000) , INOUT v INT)
BEGIN
   set @flag = v;
   set @sql = CONCAT('select count(*) into @res from ' , tableName , ' where ACTIVE_FLAG=?');
   PREPARE stmt FROM @sql;
   EXECUTE stmt using @flag;
   DEALLOCATE PREPARE stmt;
   set v = @res;
   set sqlStr = @sql;
END

通过继承StoredProcedure,我们可以为该存储过程的调用提供一个对应的操作对象:

public class CountTableStoredProcedure extends StoredProcedure {

   private static final String PROCEDURE_NAME = "CountTable";

   public static final String IN_PARAMETER_NAME = "tableName";
   public static final String OUT_PARAMETER_NAME = "sqlStr";
   public static final String INOUT_PARAMETER_NAME = "v";

   public CountTableStoredProcedure(DataSource dataSource)
   {
     super(dataSource,PROCEDURE_NAME);
     // setFunction(true);
     declareParameter(new SqlParameter(IN_PARAMETER_NAME,Types.VARCHAR));
     declareParameter(new SqlOutParameter(OUT_PARAMETER_NAME,Types.VARCHAR));
     declareParameter(new SqlInOutParameter(INOUT_PARAMETER_NAME,Types.INTEGER));
     compile();
   }

   public CountTableResult doCountTable(String tableName,Integer v)
   {
     Map paraMap = new HashMap();
     paraMap.put(IN_PARAMETER_NAME, tableName);
     paraMap.put(INOUT_PARAMETER_NAME, v);

     Map resultMap = execute(paraMap);

     CountTableResult result = new CountTableResult();
     result.setSql((String)resultMap.get(OUT_PARAMETER_NAME));
     result.setCount((Integer)resultMap.get(INOUT_PARAMETER_NAME));
     return result;
   }
}

关于该存储过程操作对象,部分细节我们有必要关注一下:

存储过程操作对象对应的SQL是存储过程的名称,而不是真正意义上的SQL语句,当我们调用compile方法的时候,StoredProcedure的父类SqlCall会根据你提供的存储过程名称拼装真正意义上的符合SQL92标准的存储过程调用语句,类似于“{ call CountTable(?,?,?) }”的形式。

因为我们的CountTableStoredProcedure只针对CountTable存储过程调用,所以,该存储过程的名称我们在类一开始就声明为常量:

private static final String PROCEDURE_NAME = "CountTable";如果有多个存储过程的参数顺序相同,结果处理也一样的话,你也可以将存储过程的名称声明为变量,这完全要取决于具体的应用场景。

在构造方法中,我们将“setFunction(true);”注释掉了,因为我们调用的CountTable不是一个Function,如果你要调用的存储过程类型为Function的话,你需要通过该方法将“function”的值设置为true,以告知StoredProcedure在处理调用的时候要区别对待。

在complie之前通过declareParameter声明参数,这几乎是雷打不动的惯例,不过,在StoredProcedure中使用declareParameter的时候却要有所注意了:

时间: 2024-10-31 15:32:08

spring中调用存储过程的相关文章

解析在ASP.NET中调用存储过程的方法

在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不可少的操作.调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的. 存储过程简介 简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与应用程序中的函数过程类似,

C#中调用存储过程主要是参数使用问题

存储过程|问题 C#中调用存储过程主要是参数使用问题(输入参数,输出参数,返回值)         //现假设conn是已经定义好的连接,proc为存储过程名         //1.调用无参数无返回的存储过程        //SqlCommand cmd=new SqlCommand(proc,conn);        //cmd.CommandType=CommandType.StoredProcedure;//告知执行存储过程        //conn.Open();       

在ASP.NET中调用存储过程方法新解

asp.net|存储过程 在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不可少的操作.调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的. 存储过程简介 简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与

在.net中调用存储过程的另一种方法

存储过程 [存储过程]  CREATE PROCEDURE Test_procedure @cid int ,@y int, @n varchar(10) output  AS  select * from city where cid=@cid  if @y=1  begin    set @n = '成功!'    return 0  end  else  begin    set @n = '失败!'    return -1  end  GO  [程序中调用存储过程]   Private

数据库 存储过程-在程序中调用存储过程确查不出数据?

问题描述 在程序中调用存储过程确查不出数据? 在sql数据库中调用存储过程可以查询出结果,在程序中调用存储过程确查不出数据?这是什么原因? 解决方案 use test1 go IF EXISTS (SELECT * FROM sys.objects WHERE object_id = Object_id(N'[t_sp_test111]') AND Objectproperty(object_id, N'IsUserTable') = 1) drop table t_sp_test111 go

asp.net中调用存储过程的方法_实用技巧

本文实例讲述了asp.net中调用存储过程的方法.分享给大家供大家参考,具体如下: 一.建立并调用一个不带参数的存储过程如下: CREATE PROCEDURE 全部学生<dbo.selectUsers> AS SELECT * FROM 学生 GO EXEC 全部学生 建立并调用一个带参数的存储过程如下: CREATE PROCEDURE 学生查询1 @SNAME VARCHAR(8),@SDEPT VARCHAR(20) AS SELECT * FROM 学生 WHERE 姓名=@SNAM

在ASP.NET中调用存储过程方法新解_自学过程

在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不可少的操作.调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的. 存储过程简介 简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与应用程序中的函数过程类似,

求教怎样在视图中调用存储过程

问题描述 如题,求在视图中调用存储过程的方式和代码. 解决方案 解决方案二:可能吗解决方案三:我使用的软件只能使用视图查询,但是因为原有数据库设计数据分布在两个表中,可能需要设计存储过程进行行列转换,如何能将使用查询结果呢.求一个方法.

SQL存储过程中调用存储过程返回的表

      存储过程pro_A返回一个表集合TableA,在存储过程pro_B中以TableA为数据源再做一重过滤,想实现代码复用,因此原意是在存储过程pro_B中调用存储过程pro_A,但事实发现我们不能写成select * from (exec pro_A para1,para2) a ;虽然返回结果是表集合. 后来想执行存储过程返回一个output表变量,就像一般变量一样,但存储过程可不支持这种写法:想到最后只能将pro_A 的内容写在一个函数中fn_A,函数支持返回表,可以写成selec