Spring JdbcTemplate使用(四)

2014-11-24 10:18:57 · 作者: · 浏览: 1
arameter("str", Types.VARCHAR));
Map outValues = mysqlJdbcTemplate.call(
new CallableStatementCreator() {
@Override
public CallableStatement createCallableStatement(Connection conn) throws SQLException {
CallableStatement cstmt = conn.prepareCall(callFunctionSql);
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setString(2, "test");
return cstmt;
}}, params);
Assert.assertEquals(4, outValues.get("result"));
}
public DataSource getMysqlDataSource() {
String url = "jdbc:mysql://localhost:3306/test";
DriverManagerDataSource dataSource =
new DriverManagerDataSource(url, "root", ""); dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}

getMysqlDataSource:首先启动mysql(本书使用5.4.3版本),其次登录mysql创建test数据库(“create database test;”),在进行测试前,请先下载并添加mysql-connector-java-5.1.10.jar到classpath;
{ = call FUNCTION_TEST( )}:可以使用{ = call …}形式调用自定义函数;
params:无需使用SqlReturnResultSet提取结果集数据,而是使用SqlOutParameter来描述自定义函数返回值;
CallableStatementCreator:同上个例子含义一样;
cstmt.registerOutParameter(1, Types.INTEGER):将OUT类型参数注册为JDBC类型Types.INTEGER,此处即返回值类型为Types.INTEGER。
outValues.get("result"):获取结果,直接返回Integer类型,比hsqldb简单多了吧。
最后看一下如何如何调用存储过程:
[java]
@Test
public void testCallableStatementCreator3() {
final String callProcedureSql = "{call PROCEDURE_TEST( , )}";
List params = new ArrayList();
params.add(new SqlInOutParameter("inOutName", Types.VARCHAR));
params.add(new SqlOutParameter("outId", Types.INTEGER));
Map outValues = jdbcTemplate.call(
new CallableStatementCreator() {
@Override
public CallableStatement createCallableStatement(Connection conn) throws SQLException {
CallableStatement cstmt = conn.prepareCall(callProcedureSql);
cstmt.registerOutParameter(1, Types.VARCHAR);
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.setString(1, "test");
return cstmt;
}}, params);
Assert.assertEquals("Hello,test", outValues.get("inOutName"));
Assert.assertEquals(0, outValues.get("outId"));
}

{call PROCEDURE_TEST( , )}:定义存储过程sql;
params:定义存储过程参数;SqlInOutParameter描述INOUT类型参数、SqlOutParameter描述OUT类型参数;
CallableStatementCreator:用于创建CallableStatement,并设值及注册OUT参数类型;
outValues:通过SqlInOutParameter及SqlOutParameter参数定义的name来获取存储过程结果。

JdbcTemplate类还提供了很多便利方法,在此就不一一介绍了,但这些方法是由规律可循的,第一种就是提供回调接口让用户决定做什么,第二种可以认为是便利方法(如queryForXXX),用于那些比较简单的操作。