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