Spring 1.2 中的 RowMapper 方法如何工作?

How is the RowMapper Method working from Spring 1.2?

我正在为我的公司编写 Spring 1.2 实施的巨型应用程序的文档,该应用程序在大约 8 年前编码时没有记录。

现在我正在使用 java classes 之一,并坚持使用特定方法来了解它的实际工作方式,特别是 "new RowMapper()" 开始的部分。我看过不同的行映射器示例,但仍然对它的实际作用感到困惑。任何有 Spring 经验的人,请帮助我。

我只想知道这个方法是干什么的

这些是从 Java SqlSpring Framework 为 class.

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.rowset.SqlRowSet;

initOrderList 方法

private List initOrderList(java.util.Date ShipDate, final String sqlStatement)
{
Calendar cal = Calendar.getInstance();
cal.setTime(ShipDate);
cal.add(5, 1);
java.util.Date ship1 = cal.getTime();

final java.sql.Date sqlToday = new java.sql.Date(ShipDate.getTime());
final java.sql.Date shipDate = new java.sql.Date(ship1.getTime());
final java.sql.Date ESDDate = new java.sql.Date(ShipDate.getTime());

List ret = this.jdbcTemplate.query(new PreparedStatementCreator()

  new RowMapper
  {
    public PreparedStatement createPreparedStatement(Connection conn)
      throws SQLException
    {
      PreparedStatement ps = conn.prepareStatement(sqlStatement);
      ps.setDate(1, sqlToday);
      ps.setDate(2, shipDate);
      ps.setDate(3, ESDDate);
      return ps;
    }
  }, new RowMapper()
  {
    public Object mapRow(ResultSet rs, int rowNum)
      throws SQLException
    {
      VCData vcData = new VCData();
      vcData.setOrderNo(rs.getString(1).trim());
      vcData.setShipUserID(rs.getString(2).trim());
      vcData.setShipDate(rs.getString(3).trim());
      vcData.setVendorNo(rs.getString(4).trim());
      vcData.setNMDiv(rs.getString(5).trim());
      vcData.setESD(rs.getString(6).trim());
      vcData.setOrigESD(vcData.getESD());

      return vcData;
    }
  });
return ret;}

完整的 java class link 在这里:https://app.box.com/s/9w30z7aa3ynpk7cg7bucd298qvdarq1q

请尽量详细。我是一名实习生,正在学习。谢谢。

jdbcTemplate 将负责为您完成所有 sql 的工作并获得 java.sql.ResultSet 回报。 ResultSet 表示来自查询执行的 table 数据。

如果您自己编写纯 JDBC 代码而不是使用 Spring,您将不得不一次一行地遍历结果集(检查是否有下一条记录)并处理它。加上所有有趣的东西,比如关闭结果集和捕获 SQLException。 Spring 从你那里抽象出来。

相反,您实现了 RowMapper(在您的例子中是匿名的 class)并将其用作回调。 Spring其实就是循环遍历ResultSet,移动光标位置。你可以认为伪代码 Spring 是这样执行的

while(resultSet has more results){
    move cursor to next row
    VCData row = //calls your mapRow method, passing in the current row #
    add row to List
}
return List<VCData>
close resultSet and cleanup

您只需告诉它在每一行上做什么。 VCData 是您对该行的表示。您返回并存储在 ret 中的列表是作为 VCData 对象的所有行的列表。