以前一篇中写到了 hibernate 调用存储过程,这里介绍 Spring 借道 JdbcTemplate 如何调用数据库存储过程。还是以前面的那个 DB2 存储过程为例,该过程的代码如下:
1 2 3 4 5 6 7 |
CREATE procedure selectAllUsers(IN piAge INTEGER) DYNAMIC RESULT SETS 1 BEGIN DECLARE temp_cursor1 CURSOR WITH RETURN TO CLIENT FOR SELECT * FROM test where age < piAge; OPEN temp_cursor1; END; |
这个过程中最后一行直接打开了一个游标,也就是返回了一个结果集。调用存储过程的方法应该看看 org.springframework.jdbc.core.JdbcTemplate 的各个 execute() 方法,具体点就是带了 CallableStatementCallback<T> 参数的那两个 execute(),究底的话又归结为其中之一。看下这两个 execute() 方法,摘自代码 Spring 3.0.5 的 org.springframework.jdbc.core.JdbcTemplate:
1 2 3 4 |
public <T> T execute(CallableStatementCreator csc, CallableStatementCallback<T> action) throws DataAccessException public <T> T execute(String callString, CallableStatementCallback<T> action) throws DataAccessException { return execute(new SimpleCallableStatementCreator(callString), action); } |
继续倾注于简单方法 public <T> T execute(String callString, CallableStatementCallback<T> action) 的使用。
在我们自己的 JdbcDao 的访问方法中,可以这么写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
@SuppressWarnings("unchecked") public List<String> getUserList(final int maxAge) { String procedure = "{call selectAllUsers(?)}"; List<String> users = getJdbcTemplate().execute(procedure, new CallableStatementCallback() { @Override public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { cs.setInt(1,maxAge); //设置参数 //如果有出口参数就得注册一下,这样后面才能取到 //比如第二个出口参数是个整数 //cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); //执行存储过程 /**********返回结果的取什方式,用 cs.getResultSet**********/ //如果存储过程最后打开的是游标就直接得到 ResultSet ResultSet rs = cs.getResultSet(); List<String> userList = new ArrayList<String>(); while(rs.next()){ System.out.println(rs.getString(1)); //....................... } return userList; /*****************THE END*******************************/ /***********以下是注册了出口参数的取值方法,cs.getXxx() *需要前面执行 cs.registerOutParameter() 来注册出口参数类型 *为了能让方法合法,这里也假设返回 List<String> List<String> userList = new ArrayList<String>(); userList.add(cs.getString(2)); return userList; *****************THE END******************************/ } }); return users; } |
以上代码同时描述了如何应对取出口参数和返回结果集的方式,杂糅在一起可能会影响视觉,对纯粹的学习会带来不便。不过要是你结合到你的实际应用的话就好理解的多。
参考:1. hibernate 调用存储过程
2. spring调用Oracle存储过程,并返回结果集的完整实例
3. 用jdbcTempate调用存储过程,处理BLOB/CLOB小记
本文链接 https://yanbin.blog/spring-jdbctemplate-call-procedure/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。