- create table TEST_USERS
- (
- USER_ID VARCHAR2(10) not null,
- NAME VARCHAR2(10) not null,
- PASSWORD VARCHAR2(20) not null
- )
create table TEST_USERS
(
USER_ID VARCHAR2(10) not null,
NAME VARCHAR2(10) not null,
PASSWORD VARCHAR2(20) not null
)
2. 创建存储过程:
- create or replace package display_users_package is
- type search_results is ref cursor;
- procedure display_users_proc(results_out out search_results, userId in test_users.user_id%type);
- end display_users_package;
-
- create or replace package body display_users_package is
- procedure display_users_proc(results_out out search_results, userId in test_users.user_id%type)
- is
- begin
- if userId is not null then
- open results_out for select * from test_users where user_id like userId || '%';
- else
- open results_out for select * from test_users;
- end if;
- end display_users_proc;
- end display_users_package;
create or replace package display_users_package is
type search_results is ref cursor;
procedure display_users_proc(results_out out search_results, userId in test_users.user_id%type);
end display_users_package;
create or replace package body display_users_package is
procedure display_users_proc(results_out out search_results, userId in test_users.user_id%type)
is
begin
if userId is not null then
open results_out for select * from test_users where user_id like userId || '%';
else
open results_out for select * from test_users;
end if;
end display_users_proc;
end display_users_package;
这个results_out是一个游标类型,用来返回查找的结果集。
3. 完整实现代码:
- import java.sql.CallableStatement;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import javax.sql.DataSource;
-
- import oracle.jdbc.OracleTypes;
-
- import org.springframework.dao.DataAccessException;
- import org.springframework.jdbc.core.CallableStatementCallback;
- import org.springframework.jdbc.core.CallableStatementCreator;
- import org.springframework.jdbc.core.JdbcTemplate;
-
- import com.spring.stored.procedure.util.DataContextUtil;
-
-
-
-
-
- public class SpringStoredProce {
-
- public List<Map> execute(String storedProc, String params){
- List<Map> resultList = null;
- try{
- final DataSource ds = DataContextUtil.getInstance().getDataSource();
- final JdbcTemplate template = new JdbcTemplate(ds);
- resultList = (List<Map>)template.execute(new ProcCallableStatementCreator(storedProc, params),
- new ProcCallableStatementCallback());
- }catch(DataAccessException e){
- throw new RuntimeException("execute method error : DataAccessException " + e.getMessage());
- }
- return resultList;
- }
-
-
-
-
-
- private class ProcCallableStatementCreator implements CallableStatementCreator {
- private String storedProc;
- private String params;
-
-
-
-
-
-
-
-
- public ProcCallableStatementCreator(String storedProc, String params) {
- this.params = params;
- this.storedProc = storedProc;
- }
-
-
-
-
-
-
- public CallableStatement createCallableStatement(Connection conn) {
- StringBuffer storedProcName = new StringBuffer("call ");
- storedProcName.append(storedProc + "(");
-
- storedProcName.append("?");
- storedProcName.append(", ");
-
-
- storedProcName.append("?");
- storedProcName.append(")");
-
- CallableStatement cs = null;
- try {
-
- cs = conn.prepareCall(storedProcName.toString());
- cs.registerOutParameter (1, OracleTypes.CURSOR);
-
- cs.setObject(2, params);
- } catch (SQLException e) {
- throw new RuntimeException("createCallableStatement method Error : SQLException " + e.getMessage());
- }
- return cs;
- }
-
- }
-
-
-
-
-
-
-
- private class ProcCallableStatementCallback implements CallableStatementCallback {
-
-
-
-
- public ProcCallableStatementCallback() {
- }
-
-
-
-
-
-
- public Object doInCallableStatement(CallableStatement cs){
- List<Map> resultsMap = new ArrayList<Map>();
- try {
- cs.execute();
- ResultSet rs = (ResultSet) cs.getObject(1);
- while (rs.next()) {
- Map<String, String> rowMap = new HashMap<String, String>();
- rowMap.put("userId", rs.getString("USER_ID"));
- rowMap.put("name", rs.getString("NAME"));
- rowMap.put("password", rs.getString("PASSWORD"));
- resultsMap.add(rowMap);
- }
- rs.close();
- }catch(SQLException e) {
- throw new RuntimeException("doInCallableStatement method error : SQLException " + e.getMessage());
- }
- return resultsMap;
- }
- }
- }
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import oracle.jdbc.OracleTypes;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;
import com.spring.stored.procedure.util.DataContextUtil;
/**
* @author Jane Jiao
*
*/
public class SpringStoredProce {
public List<Map> execute(String storedProc, String params){
List<Map> resultList = null;
try{
final DataSource ds = DataContextUtil.getInstance().getDataSource();
final JdbcTemplate template = new JdbcTemplate(ds);
resultList = (List<Map>)template.execute(new ProcCallableStatementCreator(storedProc, params),
new ProcCallableStatementCallback());
}catch(DataAccessException e){
throw new RuntimeException("execute method error : DataAccessException " + e.getMessage());
}
return resultList;
}
/**
* Create a callable statement in this connection.
*/
private class ProcCallableStatementCreator implements CallableStatementCreator {
private String storedProc;
private String params;
/**
* Constructs a callable statement.
* @param storedProc The stored procedure's name.
* @param params Input parameters.
* @param outResultCount count of output result set.
*/
public ProcCallableStatementCreator(String storedProc, String params) {
this.params = params;
this.storedProc = storedProc;
}
/**
* Returns a callable statement
* @param conn Connection to use to create statement
* @return cs A callable statement
*/
public CallableStatement createCallableStatement(Connection conn) {
StringBuffer storedProcName = new StringBuffer("call ");
storedProcName.append(storedProc + "(");
//set output parameters
storedProcName.append("?");
storedProcName.append(", ");
//set input parameters
storedProcName.append("?");
storedProcName.append(")");
CallableStatement cs = null;
try {
// set the first parameter is OracleTyep.CURSOR for oracel stored procedure
cs = conn.prepareCall(storedProcName.toString());
cs.registerOutParameter (1, OracleTypes.CURSOR);
// set the sencond paramter
cs.setObject(2, params);
} catch (SQLException e) {
throw new RuntimeException("createCallableStatement method Error : SQLException " + e.getMessage());
}
return cs;
}
}
/**
*
* The ProcCallableStatementCallback return a result object,
* for example a collection of domain objects.
*
*/
private class ProcCallableStatementCallback implements CallableStatementCallback {
/**
* Constructs a ProcCallableStatementCallback.
*/
public ProcCallableStatementCallback() {
}
/**
* Returns a List(Map) collection.
* @param cs object that can create a CallableStatement given a Connection
* @return resultsList a result object returned by the action, or null
*/
public Object doInCallableStatement(CallableStatement cs){
List<Map> resultsMap = new ArrayList<Map>();
try {
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(1);
while (rs.next()) {
Map<String, String> rowMap = new HashMap<String, String>();
rowMap.put("userId", rs.getString("USER_ID"));
rowMap.put("name", rs.getString("NAME"));
rowMap.put("password", rs.getString("PASSWORD"));
resultsMap.add(rowMap);
}
rs.close();
}catch(SQLException e) {
throw new RuntimeException("doInCallableStatement method error : SQLException " + e.getMessage());
}
return resultsMap;
}
}
}
4. 测试代码,在这里使用了Junit4测试:
- import static org.junit.Assert.assertNotNull;
- import static org.junit.Assert.assertTrue;
-
- import java.util.List;
- import java.util.Map;
-
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
-
-
-
-
-
- public class SpringStoredProceTest {
-
- private SpringStoredProce springStoredProce;
-
-
-
-
- @Before
- public void setUp() throws Exception {
- springStoredProce = new SpringStoredProce();
- }
-
-
-
-
- @After
- public void tearDown() throws Exception {
- springStoredProce = null;
- }
-
-
-
-
- @Test
- public void testExecute() {
- final String storedProcName = "display_users_package.display_users_proc";
- final String param = "test";
- List<Map> resultList = springStoredProce.execute(storedProcName, param);
- assertNotNull(resultList);
- assertTrue(resultList.size() > 0);
- for (int i = 0; i < resultList.size(); i++) {
- Map rowMap = resultList.get(i);
- final String userId = rowMap.get("userId").toString();
- final String name = rowMap.get("name").toString();
- final String password = rowMap.get("password").toString();
- System.out.println("USER_ID=" + userId + "\t name=" + name + "\t password=" + password);
- }
-
- }
- }
分享到:
相关推荐
对于 `P_EMP_SELECT` 存储过程,我们使用 `CallableStatementCallback` 对象调用存储过程,并将结果集处理到 `List` 集合中。 对于 `P_EMP_ADD` 存储过程,我们使用 `CallableStatementCallback` 对象调用存储过程...
压缩包中的“Spring10SpringJDBC2”文件名可能暗示包含的是关于Spring JDBC的第十章内容或者是关于Spring JDBC的进阶部分,可能包括了如何调用存储过程的示例代码或更详细的教程。 综上所述,本主题涵盖的知识点...
Spring jdbcTemplate 调用 Oracle 存储过程...我们创建了一个简单的存储过程,用于查询员工信息,并使用 Spring jdbcTemplate 调用存储过程来获取结果集。这种方法可以帮助我们简化数据库操作,并提高应用程序的性能。
此外,Spring JDBC也支持存储过程的调用,以及批量更新操作。在处理大量数据时,还可以通过分页查询来优化性能。在分布式环境下,Spring JDBC配合Spring的事务管理功能,可以实现跨数据库操作的事务一致性。 这个...
`SimpleJdbcInsert`和`SimpleJdbcCall`则分别用于简化插入操作和调用存储过程。 1. **JdbcTemplate使用**: - **连接管理**:Spring JDBC通过DataSource来管理数据库连接,DataSource是一个接口,实现了数据库连接...
1. **JdbcTemplate**:这是Spring JDBC的核心类,它通过模板方法模式将常见的JDBC操作进行了封装,如执行SQL查询、更新、调用存储过程等。开发者只需要关注SQL语句和参数,而无需处理连接创建、关闭、异常处理等繁琐...
2. **SimpleJdbcInsert** 和 **SimpleJdbcCall**:这两个类分别简化了插入操作和调用存储过程的过程。SimpleJdbcInsert可以自动计算生成主键值,而SimpleJdbcCall则允许开发者方便地定义和执行数据库的存储过程。 3...
Spring JDBC同样支持存储过程的调用。我们可以通过SimpleJdbcCall类来定义并执行存储过程,同样可以设置入参和出参,处理复杂的数据交互场景。 **8. 异常处理** Spring JDBC将数据库异常转换为Spring的...
此外,Spring JDBC还支持CallableStatement,用于调用数据库的存储过程。通过JdbcTemplate的call()方法,你可以传入CallableStatementCreator,然后执行存储过程并获取结果。 总之,Spring JDBC是一个强大且灵活的...
此外,SimpleJdbcInsert、SimpleJdbcCall等辅助类进一步简化了插入和调用存储过程的操作。 Spring JDBC还引入了RowMapper接口,这是一个回调接口,用于将数据库结果集中的每一行映射为一个Java对象。此外,...
2. **SimpleJdbcInsert** 和 **SimpleJdbcCall**:简化插入记录和调用存储过程的操作。 3. **Transaction Management**:SpringJDBC支持声明式和编程式事务管理,使得事务控制更加简洁和健壮。 4. **DataSource**...
2. **JdbcTemplate**:这是Spring JDBC最常用的工具类,提供了大量的模板方法,用于执行SQL查询、更新、调用存储过程等操作,大大减少了手动处理结果集和异常的情况。 3. **SimpleJdbcTemplate**:这是JdbcTemplate...
此外,Spring JDBC的`JdbcOperations`接口扩展了`JdbcTemplate`,提供了一组通用的JDBC操作,包括执行SQL查询、调用存储过程等。`NamedParameterJdbcTemplate`则是另一个扩展,它支持命名参数的SQL查询,使得查询...
7. **存储过程**:通过`call`方法,`JdbcTemplate`也可以调用数据库中的存储过程,支持输入、输出和InOut参数。 8. **自定义SQL执行**:除了提供预定义的方法,`JdbcTemplate`还允许开发人员自定义SQL执行逻辑,...
其次,Spring JDBC还引入了`SimpleJdbcInsert`和`SimpleJdbcCall`,分别用于简化插入操作和调用存储过程。`SimpleJdbcInsert`可以根据表结构自动生成INSERT语句,而`SimpleJdbcCall`则可以方便地调用数据库中的存储...
本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...
SpringMVC、Spring和SpringJDBC是Spring框架的三个重要组成部分,它们协同工作,提供了从用户接口到数据存储的完整解决方案。下面将详细介绍这三个组件及其整合方式。 **1. SpringMVC** SpringMVC(Model-View-...
7. **CallableStatement**: 用于调用数据库存储过程。 8. **ResultSet**: 存储查询结果,包含多条记录,可以迭代遍历。 而Spring Data JDBC是Spring框架的一部分,它简化了数据库操作,提供了更高层次的抽象。相比...
本示例"Spring mvc、Spring、Spring jdbc 整合 demo"着重展示了Spring框架的三大关键模块:Spring MVC(模型-视图-控制器)、Spring Core以及Spring JDBC的集成与应用。 1. **Spring MVC** Spring MVC是Spring框架...