java.lang.Object
org.springframework.jdbc.core.simple.AbstractJdbcCall
org.springframework.jdbc.core.simple.SimpleJdbcCall
SimpleJdbcCall源自springframework,是一个多线程、可重用,用来调用存储过程或者存储函数的工具,它通过提供元数据的处理方式来简化对基本的存储过程和函数的访问。我们所需要做的就是提供执行存储过程或函数的名字和用Map表示的相应的参数,这些参数的名字将会与我们创建存储过程或者函数时定义的参数名进行匹配。
元数据的处理方式是基于JDBC提供的DatabaseMetaData,这种处理方式只适用于提供元数据访问机制的数据库,像Derby, MySQL, Microsoft SQL Server, Oracle 和DB2都是可以的;对于其他不提供元数据访问的数据库,我们需要明确的定义所有参数,这一准则对所有数据库都是适用的。如果我们希望传入的参数名不要跟存储过程或者函数的名字进行匹配,我们需要显式关闭元数据的处理方式。
Spring用了“RETURN_VALUE”这个关键字来存储执行存储过程或者函数的返回值。
package com.test.dao;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import com.test.base.UserInfo;
import com.test.constants.StoreProc;
public class UserDAO {
SimpleJdbcCall simpleJdbcCall;
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public int checkUserInfo(UserInfo user){
simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate);
simpleJdbcCall.withProcedureName(StoreProc.SP_CHECK_USER_INFO_STRING).withoutProcedureColumnMetaDataAccess().withReturnValue();
// Declare parameter to save Stored Procedure return value
simpleJdbcCall.declareParameters(new SqlOutParameter("RETURN_VALUE", Types.INTEGER));
simpleJdbcCall.addDeclaredParameter(new SqlParameter("UserName", Types.VARCHAR));
simpleJdbcCall.addDeclaredParameter(new SqlParameter("Password", Types.VARCHAR));
simpleJdbcCall.addDeclaredParameter(new SqlOutParameter("Level", Types.VARCHAR));
Map<String, Object> inParamsValue = new HashMap<String, Object>();
inParamsValue.put("UserName", user.getUser());
inParamsValue.put("Password", user.getUser());
simpleJdbcCall.getJdbcTemplate().setResultsMapCaseInsensitive(true);
simpleJdbcCall.getJdbcTemplate().setSkipUndeclaredResults(true);
Map<String, Object> resultMap = simpleJdbcCall.execute(inParamsValue);
int iRetValue = Integer.parseInt(resultMap.get("RETURN_VALUE").toString());
if(iRetValue == 0){
String userLevel = resultMap.get("Level").toString();
user.setLevel(userLevel);
}
return iRetValue;
}
}
上述实例我们定义了一个UserDAO类,其中用一个函数checkUserInfo根据用户名和密码来检查用户的合法性,如果正确并返回用户的级别。程序首先用jdbcTemplate作为参数实例化了一个simpleJdbcCall对象,接着将常量定义的存储过程名SP_CHECK_USER_INFO_STRING传递给simpleJdbcCall对象并关闭的元数据的访问,返回值是需要我们显式声明的。整过过程非常明了,各个函数的作用我就不细说了,大家可以根据字面意思理解。希望看了这个实例后,大家对simpleJdbcCall的使用能有一个整体的把握。至于SimpleJdbcCall类的方法的详尽用法,请大家参考以下地址:
(org.springframework.jdbc.core.SqlParameter...)