`
jayghost
  • 浏览: 441656 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

jdbcTemplate 调用存储过程和回到函数

 
阅读更多

转: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; 
   }
});

 

 

 

 

 

分享到:
评论

相关推荐

    jdbcTemplate分页彻底解决,使用游标滚动

    4. **执行查询**:调用JdbcTemplate的`execute`方法执行SQL查询,并传入`RowCallbackHandler`实例。这将启动游标滚动,每次处理一行数据,直到所有数据都被处理。 5. **计算总记录数**:为了提供分页信息,我们还...

    SpringBoot JdbcTemplate批量操作的示例代码

    5. `call`方法:用于调用存储过程或函数。 批量插入操作的示例代码如下,使用JdbcTemplate的`batchUpdate`方法: ```java @Autowired private JdbcTemplate jdbcTemplate; public void batchSave(){ List[]&gt; ...

    JdbcTemplate方法介绍与增删改查操作实现

    call方法用于调用数据库的存储过程或函数,它接受CallableStatementCreator和SqlParameterSource,返回CallableStatement的执行结果。 现在,我们来看如何使用JdbcTemplate实现增删改查操作: **添加数据**: 在...

    跟我学Spring3(7.5)对JDBC的支持之集成Spr

    除了JdbcTemplate,Spring JDBC还提供了SimpleJdbcInsert、SimpleJdbcCall等工具类,简化了插入和调用存储过程的操作。同时,Spring的Transaction Management支持使得事务控制变得简单,只需要在配置中声明@...

    Spring JDBC相关jar包:spring_jdbc_4.0.0.zip

    8. **自定义SQL执行**:除了提供预定义的方法,`JdbcTemplate`还允许开发人员自定义SQL执行逻辑,通过`SimpleJdbcCall`类可以处理复杂的存储过程或函数调用。 在实际应用中,结合Spring的其他模块,如MyBatis-...

    Java闭包练习

    Lambda表达式可以被视为没有名字的方法,它可以捕获和存储它被定义时所在作用域内的变量值。这使得Lambda能够访问并修改其外部作用域的变量,这就是闭包的核心特性。 描述中的"Java8 Java7 练手"可能意味着这个练习...

    spring整合jdbc学习资料

    在Java中,我们可以使用CallableStatement来调用存储过程。例如,创建CallableStatement,设置输入参数和输出参数,然后执行executeUpdate()获取结果。 JdbcTemplate是Spring为JDBC提供的一种抽象,它简化了数据库...

    Just Spring Data Access

    - **SimpleJdbcCallClass**:这个类则专门用于调用存储过程或函数,支持输入和输出参数的设置。 - **In-Memory Databases**:为了便于测试和快速原型设计,书中还介绍了如何使用内存数据库,如H2或HSQLDB,这些...

    spring 中的jdbc

    3. `SimpleJdbcCall`:用于调用存储过程和函数,支持输入、输出和InOut参数。 4. `NamedParameterJdbcTemplate`:这个类允许使用命名参数代替占位符,使得SQL语句更易读。 二、事务管理 Spring JDBC提供了一种...

    spring的JDBC开发类

    `SimpleJdbcInsert`简化了插入数据的过程,允许我们基于表结构动态构造INSERT语句,而`SimpleJdbcCall`则用于执行存储过程,使得调用数据库中的自定义函数或过程变得简单。 在事务管理方面,Spring JDBC提供了`...

    Spring持久化模板总结

    4. **回调机制**:HibernateTemplate提供了doInHibernate()和doInTransaction()等方法,允许用户自定义回调函数,进行更复杂的数据库操作。 **JdbcDaoSupport和HibernateDaoSupport** 这两个类是Spring提供的一般...

    Spring中文帮助文档

    使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...

    JAVAWEB-14:MySQL

    MySQL支持创建存储过程和函数,它们是预编译的SQL代码块,可以在需要时多次调用。这有助于减少网络传输,提高性能,并封装复杂的业务逻辑。 9. **索引与优化** 索引是提高查询速度的关键。在MySQL中,可以创建...

    北大青鸟练习项目鸟人留言板

    它消除了Ajax(异步JavaScript和XML)应用中的许多复杂性,使得前端开发者可以像调用本地函数一样调用服务器端的方法。在鸟人留言板项目中,DWR可能用于实现动态的留言展示和提交,用户无需刷新页面就能看到新的留言...

    Accessing-Databases-JDBC

    存储过程是一组预编译的 SQL 语句,存储在数据库中,可以像调用函数一样调用它们。使用 JDBC 可以轻松地调用这些存储过程。这可以通过 `CallableStatement` 类来实现。 ```java String sql = "{call MyProcedure(?,...

    SQL语句封装

    SQL语句封装是指将复杂的、重复的SQL查询语句进行抽象和封装,以便在需要的时候方便调用,提高代码的可读性、可维护性和复用性。这一技术在开发过程中广泛应用,尤其是在大型项目或团队协作中。 **1. SQL语句封装的...

    oracle视频8

    此外,对于Oracle数据库,了解PL/SQL(Procedural Language/Structured Query Language)也是重要的,它是Oracle特有的过程化SQL语言,用于编写存储过程、函数、包等,增强数据库的功能和灵活性。在视频8中,可能...

    spring + jdbc框架

    Spring 框架是Java开发中的一个核心框架,它提供了全面的编程和配置模型,用于简化企业级应用的开发。...此外,Spring框架提供的工具和库使得开发过程更为高效,降低了错误的可能性,提高了代码的可维护性。

Global site tag (gtag.js) - Google Analytics