转: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; } });
相关推荐
4. **执行查询**:调用JdbcTemplate的`execute`方法执行SQL查询,并传入`RowCallbackHandler`实例。这将启动游标滚动,每次处理一行数据,直到所有数据都被处理。 5. **计算总记录数**:为了提供分页信息,我们还...
5. `call`方法:用于调用存储过程或函数。 批量插入操作的示例代码如下,使用JdbcTemplate的`batchUpdate`方法: ```java @Autowired private JdbcTemplate jdbcTemplate; public void batchSave(){ List[]> ...
call方法用于调用数据库的存储过程或函数,它接受CallableStatementCreator和SqlParameterSource,返回CallableStatement的执行结果。 现在,我们来看如何使用JdbcTemplate实现增删改查操作: **添加数据**: 在...
除了JdbcTemplate,Spring JDBC还提供了SimpleJdbcInsert、SimpleJdbcCall等工具类,简化了插入和调用存储过程的操作。同时,Spring的Transaction Management支持使得事务控制变得简单,只需要在配置中声明@...
8. **自定义SQL执行**:除了提供预定义的方法,`JdbcTemplate`还允许开发人员自定义SQL执行逻辑,通过`SimpleJdbcCall`类可以处理复杂的存储过程或函数调用。 在实际应用中,结合Spring的其他模块,如MyBatis-...
Lambda表达式可以被视为没有名字的方法,它可以捕获和存储它被定义时所在作用域内的变量值。这使得Lambda能够访问并修改其外部作用域的变量,这就是闭包的核心特性。 描述中的"Java8 Java7 练手"可能意味着这个练习...
在Java中,我们可以使用CallableStatement来调用存储过程。例如,创建CallableStatement,设置输入参数和输出参数,然后执行executeUpdate()获取结果。 JdbcTemplate是Spring为JDBC提供的一种抽象,它简化了数据库...
- **SimpleJdbcCallClass**:这个类则专门用于调用存储过程或函数,支持输入和输出参数的设置。 - **In-Memory Databases**:为了便于测试和快速原型设计,书中还介绍了如何使用内存数据库,如H2或HSQLDB,这些...
3. `SimpleJdbcCall`:用于调用存储过程和函数,支持输入、输出和InOut参数。 4. `NamedParameterJdbcTemplate`:这个类允许使用命名参数代替占位符,使得SQL语句更易读。 二、事务管理 Spring JDBC提供了一种...
`SimpleJdbcInsert`简化了插入数据的过程,允许我们基于表结构动态构造INSERT语句,而`SimpleJdbcCall`则用于执行存储过程,使得调用数据库中的自定义函数或过程变得简单。 在事务管理方面,Spring JDBC提供了`...
4. **回调机制**:HibernateTemplate提供了doInHibernate()和doInTransaction()等方法,允许用户自定义回调函数,进行更复杂的数据库操作。 **JdbcDaoSupport和HibernateDaoSupport** 这两个类是Spring提供的一般...
使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...
MySQL支持创建存储过程和函数,它们是预编译的SQL代码块,可以在需要时多次调用。这有助于减少网络传输,提高性能,并封装复杂的业务逻辑。 9. **索引与优化** 索引是提高查询速度的关键。在MySQL中,可以创建...
它消除了Ajax(异步JavaScript和XML)应用中的许多复杂性,使得前端开发者可以像调用本地函数一样调用服务器端的方法。在鸟人留言板项目中,DWR可能用于实现动态的留言展示和提交,用户无需刷新页面就能看到新的留言...
存储过程是一组预编译的 SQL 语句,存储在数据库中,可以像调用函数一样调用它们。使用 JDBC 可以轻松地调用这些存储过程。这可以通过 `CallableStatement` 类来实现。 ```java String sql = "{call MyProcedure(?,...
SQL语句封装是指将复杂的、重复的SQL查询语句进行抽象和封装,以便在需要的时候方便调用,提高代码的可读性、可维护性和复用性。这一技术在开发过程中广泛应用,尤其是在大型项目或团队协作中。 **1. SQL语句封装的...
此外,对于Oracle数据库,了解PL/SQL(Procedural Language/Structured Query Language)也是重要的,它是Oracle特有的过程化SQL语言,用于编写存储过程、函数、包等,增强数据库的功能和灵活性。在视频8中,可能...
Spring 框架是Java开发中的一个核心框架,它提供了全面的编程和配置模型,用于简化企业级应用的开发。...此外,Spring框架提供的工具和库使得开发过程更为高效,降低了错误的可能性,提高了代码的可维护性。