JdbcTemplate可以通过调用CallableStatement来执行存储过程。主要步骤如下:
- 定义存储过程:
CREATE PROCEDURE get_user(IN id INT, OUT name VARCHAR(50))
BEGIN
SELECT name INTO name FROM user WHERE id = id;
END
- 构造调用语句:
CALL get_user(?, ?)
- 定义CallableStatementCreator接口实现,用于构造调用语句:
CallableStatementCreator csc = new CallableStatementCreator() {
public CallableStatement createCallableStatement(Connection conn) throws SQLException {
return conn.prepareCall("{CALL get_user(?, ?)}");
}
};
- 执行存储过程并提取OUT参数:
final String[] name = new String[1];
jdbcTemplate.call(csc, new CallableStatementCallback<Void>() {
public Void doInCallableStatement(CallableStatement cs) throws SQLException {
cs.setInt(1, 1);
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
name[0] = cs.getString(2);
return null;
}
});
System.out.println(name[0]); // John
- 传入CallableStatementCreator实现构造调用语句
- 实现CallableStatementCallback接口,在回调方法中设置IN参数,注册OUT参数,执行调用并提取OUT参数
- OUT参数通过数组传入,回调后得到输出值
所以,通过JdbcTemplate调用存储过程主要需要完成3个步骤:
- 构造存储过程调用语句
- 实现CallableStatementCreator构造CallableStatement
- 实现CallableStatementCallback设置参数、执行调用和获取输出
JdbcTemplate通过这种方式,简化了存储过程的调用,隐藏了JDBC底层细节,提供了更易用的接口。