Spring-JdbcTemplete调用Mysql存储过程

Spring-JdbcTemplete调用Mysql存储过程

2007-09-1910:42A.M.

Springframework提供了调用存储过程的方法,下面对几个相关的类和接口做简单介绍,你也可以通过SpringAPI获得更多详细信息。

org.springframework.jdbc.object.StoredProcedure 这是一个抽象类,通过declareParameter方法来声明存储过程的输入输出参数,再由execute方法来调用存储过程。
org.springframework.jdbc.core.SqlParameter 用来代表存储过程的参数。
org.springframework.jdbc.core.ResultSetSupportingSqlParameter SqlParameter的子类,是SqlOutParameter、SqlReturnResultSet这些支持结果集参数类的公共基类。
org.springframework.jdbc.core.SqlOutParameter ResultSetSupportingSqlParameter的子类,用来代表存储过程的输出参数。
org.springframework.jdbc.core.SqlReturnResultSet ResultSetSupportingSqlParameter的子类,用来代表调用存储过程的输出结果集。
org.springframework.jdbc.core.RowMapper 这是一个接口,通常为JdbcTemplate的查询方法或者存储过程返回结果集使用。
了解了Spring为我们提供的这些关于存储过程的方法和接口后,来看看具体的实现方法。如清单所示。

--使用Springframework获得存储过程的传出参数和结果集

SearchDAOImpl.java中有三个内部类,其中SearchCustomersProcedure来负责声明数据库连接和存储过程名(2)、输入参数(6)、输出参数(5)以及输出结果集(3)(4),DemoRowMapper和DemoRowMapper2来负责取得结果集中的数据。其中(3)创建一个名为"resultSet"的结果集,通过DemoRowMapper(7)来取得结果集中的数据,当有多个结果集的时候需要重复这个过程,如(6)(8)。最后由execute方法(1)填入输入参数并执行存储过程调用。

CodeinSearchDAOImpl.java.

public Map execute(String custNum) {
      SearchCustomersProcedure sp = new SearchCustomersProcedure(dataSource);
      Map map = new HashMap(1);
      map.put("piCust_num", custNum);
      Map results = sp.execute(map);                   |(1)
      return results;
}

private class SearchCustomersProcedure extends StoredProcedure {
 SearchCustomersProcedure(DataSource dataSource) {
      super(dataSource, sprocName);                     |(2)        
      declareParameter(new SqlReturnResultSet("resultSet",
        new DemoRowMapper()));           |(3)
      declareParameter(new SqlReturnResultSet("resultSet2",
        new DemoRowMapper2()));          |(4)

      declareParameter(new SqlOutParameter("poGenStatus", Types.INTEGER));       
      |(5)
      declareParameter(new SqlParameter("piCust_num", Types.VARCHAR));       
      |(6) }
}

private class DemoRowMapper implements RowMapper {               |(7)
 public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
      Customer customer = new Customer();
      customer.setCustNum(rs.getString(1));
      customer.setCustName(rs.getString(2));
      return customer;
 }
}

private class DemoRowMapper2 implements RowMapper {              |(8)
 public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
      Customer customer = new Customer();
      customer.setCustName(rs.getString(1));
      customer.setCustNum(rs.getString(2));
customer.setCustAddress(rs.getString(3));
      customer.setCustCity(rs.getString(4));
      customer.setCustCountry(rs.getString(5));
      return customer;
 }
}

--直接调用带参数的存储过程

DataProcessDAO.java

public class DataProcessDAO {

public DataProcessDAO() {}

/**
* Dataprocess       此方法将调用Mysql存储过程 "OYP_TO_NEWYP(IN PROVINCE varchar(10) ,IN VERNIER BIGINT)" 以处理数据库表.
* @param proviceCode
* @param startVernier
* @return
*/
public Object oYPToNewYP(String proviceCode, Long startVernier) {
         final String psql = "{call OYP_TO_NEWYP(?,?)}"; 
         Object[] params = new Object[] { proviceCode, startVernier };
         return jdbcTemplate.update(psql,params);
}

private JdbcTemplate jdbcTemplate;
public void setJdbcTemplete(JdbcTemplate jdbcTemplete) {
       this.jdbcTemplate = jdbcTemplete;
}

}

相关推荐