jdbctempleate 执行postgres 数据库存储过程返回结果集

创建表:


create table myuser
(
id numeric(5,0) not null,
name varchar(20) not null,
sex varchar(8) not null
)
insert into myuser values(1 , '李亚希' , '男' );


创建存储过程

CREATE LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION getUsers()
RETURNS refcursor AS
$$
DECLARE recordcur refcursor;

BEGIN
OPEN recordcur FOR
SELECT id, name ,sex FROM myuser;
RETURN recordcur;
END;
$$LANGUAGE plpgsql;

这个文件我为了测试方便 放在 src 目录下
spring 配置文件

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>org.postgresql.Driver</value>
</property>
<property name="url">
<value>jdbc:postgresql://localhost:5432/postgres</value>
</property>
<property name="username">
<value>postgres</value>
</property>
<property name="password">
<value>postgres</value>
</property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>

java 代码:

package test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"dao.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) context
.getBean("jdbcTemplate");
jdbcTemplate.execute(new CallableStatementCreator() {
public CallableStatement createCallableStatement(Connection con)
throws SQLException {
String storedProc = "{?=call getUsers()}";// 调用的sql
con.setAutoCommit(false); //这句很重要 , 没有报错
CallableStatement cs = con.prepareCall(storedProc);
cs.registerOutParameter(1, Types.OTHER);
return cs;
}
}, new CallableStatementCallback<Object>() {
public Object doInCallableStatement(CallableStatement cs)
throws SQLException, DataAccessException {
List<Map<String, String>> resultsMap = new ArrayList<Map<String, String>>();
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(1);// 获取游标一行的值
while (rs.next()) {// 转换每行的返回值到Map中
Map<String, String> rowMap = new HashMap<String, String>();
rowMap.put("id", rs.getString("id"));
rowMap.put("name", rs.getString("name"));
rowMap.put("sex", rs.getString("sex"));
System.out.println(rowMap.get("id") + "========="
+ rowMap.get("name") + "==========="
+ rowMap.get("sex"));
}
rs.close();
return resultsMap;
}
});
}
}



执行结果:
1=========李亚希===========男
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值