spring中调用存储历程[Java编程]
本文“spring中调用存储历程[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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的时刻却要有所注意了:
以上是“spring中调用存储历程[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |