转:http://blog.csdn.net/dancelonely/article/details/9363939
1、使用jdbcTemplate调用存储过程
Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装。
一)无返回值的存储过程调用
CREATE OR REPLACE PROCEDURE TESTPRO(PARAM1 IN VARCHAR2,PARAM2 IN VARCHAR2) AS BEGIN INSERT INTO TESTTABLE (ID,NAME) VALUES (PARAM1, PARAM2); END TESTPRO;
package com.dragon.test; import org.springframework.jdbc.core.JdbcTemplate; public class JdbcTemplateTest { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void test(){ this.jdbcTemplate.execute("call testpro('p1','p2')"); } }
二)有返回值的存储过程(非结果集)
public void test() { String param2Value = (String) jdbcTemplate.execute( new CallableStatementCreator() { public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = "{call testpro(?,?)}";// 调用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, "p1");// 设置输入参数的值 cs.registerOutParameter(2, OracleTypes.VARCHAR);// 注册输出参数的类型 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { cs.execute(); return cs.getString(2);// 获取输出参数的值 } }); }
三)有返回值的存储过程(结果集)
因oracle存储过程所有返回值都是通过out参数返回的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage。
public void test() { List resultList = (List) jdbcTemplate.execute( new CallableStatementCreator() { public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = "{call testpro(?,?)}";// 调用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, "p1");// 设置输入参数的值 cs.registerOutParameter(2, OracleTypes.CURSOR);// 注册输出参数的类型 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException { List resultsMap = new ArrayList(); cs.execute(); ResultSet rs = (ResultSet) cs.getObject(2);// 获取游标一行的值 while (rs.next()) {// 转换每行的返回值到Map中 Map rowMap = new HashMap(); rowMap.put("id", rs.getString("id")); rowMap.put("name", rs.getString("name")); resultsMap.add(rowMap); } rs.close(); return resultsMap; } }); for (int i = 0; i < resultList.size(); i++) { Map rowMap = (Map) resultList.get(i); String id = rowMap.get("id").toString(); String name = rowMap.get("name").toString(); System.out.println("id=" + id + ";name=" + name); } }
2、jdbcTemplate查询数据 三种callback
1)org.springframework.jdbc.core.ResultSetExtractor:基本上属于JdbcTemplate内部使用的Callback接口,相对于下面两个Callback接口来说,ResultSetExtractor拥有更多的控制权,因为使用它,需要自行处理ResultSet。
public interface ResultSetExtractor { Object extractData(ResultSet rs) throws SQLException, DataAccessException; } List customerList = (List)jdbcTemplate.query("select * from customer", new ResultSetExtractor(){ public Object extractData(ResultSet rs) throws SQLException,DataAccessException { List customers = new ArrayList(); while(rs.next()) { Customer customer = new Customer(); customer.setFirstName(rs.getString(1)); customer.setLastName(rs.getString(2)); ... customers.add(customer); } return customers; } });
2)org.springframework.jdbc.core.RowCallbackHandler:RowCallbackHandler相对于ResultSetExtractor来说,仅仅关注单行结果的处理,处理后的结果可以根据需要存放到当前RowCallbackHandler对象内或者使用JdbcTemplate的程序上下文中。
public interface RowCallbackHandler { void processRow(ResultSet rs) throws SQLException; } final List customerList = new ArrayList(); jdbcTemplate.query("select * from customer", new RowCallbackHandler(){ public void processRow(ResultSet rs) throws SQLException { Customer customer = new Customer(); customer.setFirstName(rs.getString(1)); customer.setLastName(rs.getString(2)); ... customerList.add(customer); } });
3)org.springframework.jdbc.core.RowMapper:ResultSetExtractor的精简版,功能类似于RowCallbackHandler,也只关注处理单行的结果,不过,处理后的结果会由ResultSetExtractor实现类进行组合。
public interface RowMapper { Object mapRow(ResultSet rs, int rowNum) throws SQLException; } List customerList = jdbcTemplate.query("select * from customer", new RowMapper(){ public Object mapRow(ResultSet rs, int rowNumber) throws SQLException { Customer customer = new Customer(); customer.setFirstName(rs.getString(1)); customer.setLastName(rs.getString(2)); ... return customer; } });
相关推荐
使用Spring的JdbcTemplate调用Oracle的存储过程
Spring JdbcTemplate调用Oracle存储过程输出游标结果集实现增删改查
Spring jdbcTemplate调用Oracle存储过程返回List集合
1、关于 JdbcTemplate 的介绍、pom 依赖、DI 注入可以参考《Spring JdbcTemplate 模板剖析 之 常用 增删改查》,本文继续介绍 JdbcTemplate 调用数据库的存储过程,虽然 Mysql 也有存储过程,但是为了尽可能的多覆盖...
JdbcTemplate 调用存储过程
配制Spring事务和JdbcTemplate使用 配制Spring事务和JdbcTemplate使用
JdbcTemplate是spring-jdbc提供的数据库核心操作类,那对JdbcTemplate进行事务控制呢?
spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。
spring-jdbcTemplate实例工程
使用Spring的JdbcTemplate实现分页功能
JdbcTemplate使用就是JdbcTemplate的使用 再说两遍JdbcTemplate使用就JdbcTemplate的使用 20字够了
JdbcTemplate CRUD示例
jdbcTemplate分页彻底解决,使用游标滚动jdbcTemplate分页彻底解决,使用游标滚动
SpringJdbcTemplate封装工具包,包括规范model格式接口,封装SpringJdbcTemplate,实现分页,自适应多种数据库
jdbcTemplate
很基础的spring JDBCtemplate 的使用,包括不使用JDBCtemplate 和使用JDBCtemplate两种方法对比。
提供了使用Spring的jdbcTemplate需要导入的五个jar包
第一、使用Hibernate 的sql 查询函数,将查询结果对象转为Entity对象。 第二、使用Hibernate Session的getConnection 获得JDBC Connection,然后进行纯JDBC API操作; 第三、选择把Spring的JDBCTemplate作为一种很...