关于RowMapper在Spring Framework应用程序中使用JDBC的一些疑问

And*_*ili 15 java spring jdbc spring-mvc spring-jdbc

我正在研究如何在Spring Framework中使用JDBC对数据库执行查询.

我正在学习本教程:http://www.tutorialspoint.com/spring/spring_jdbc_example.htm

在本教程中,我定义了一个StudentDAO接口,它只定义了我想要的CRUD方法.

然后定义Student类,它是我想要在Student数据库表上保留的实体.

然后定义StudentMapper类,它是RowMapper接口的特定实现,在这种情况下,用于将ResultSet中的特定记录(由查询返回)映射到Student对象.

然后,我有StudentJDBCTemplate是rappresent我实施StudentDAO界面,在这个类我实现的接口中定义的CRUD方法.

好了,现在我有一个关于如何疑问StudentMapper类的工作:在这个StudentJDBCTemplate类有定义的返回是在学生数据库表中的所有记录的列表的方法,这其中:

   public List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, 
                                new StudentMapper());
      return students;
   }
Run Code Online (Sandbox Code Playgroud)

你怎么看,这个方法返回一个List of Student对象并按以下方式工作:

它首先要做的是定义返回 SQL String中Student数据库表所有记录的查询.

然后通过jdbcTemplateObject对象上的查询方法调用执行此查询(这是JdbcTemplate Spring类的一个等级**

此方法有两个参数:SQL String(包含必须执行的SQL查询)和一个新的StudentMapper对象,它接受查询返回的ResultSet对象并将其记录映射到新的Student对象上

在这里阅读:http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html sayas:执行给定静态SQL的查询,将每一行映射到Java通过RowMapper对象.

我的疑问是有关事实,我的StudentMapper映射使用一个Student对象上一个ResultSet记录mapRow()方法,这是代码:

package com.tutorialspoint;

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setId(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      return student;
   }
}
Run Code Online (Sandbox Code Playgroud)

那么,谁调用这个mapRow方法呢?它是由Spring Framework自动调用的吗?(因为在这个例子中永远不会手动调用...)

TNX

安德里亚

然后通过jdbcTemplateObject对象上的查询方法调用执行此查询(这是JdbcTemplate Spring类的一个等级**

Sot*_*lis 23

将实例传递RowMapperJdbcTemplate方法时

List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
Run Code Online (Sandbox Code Playgroud)

JdbcTemplate取决于哪种方法你打电话,将在内部使用,结果映射器设置它从JDBC连接变得创建您的请求类型的对象.例如,自从您调用以来JdbcTemplate#query(String, RowMapper),该方法将使用您的String SQL来查询数据库,并将循环遍历每个"行" ResultSet,如下所示:

ResultSet rs = ... // execute query
List<Student> students = ...// some list
int rowNum = 0;
while(rs.next()) {
    Student student = rowMapper.mapRow(rs, rowNum);
    students.add(student);
    rowNum++;
}

return students;
Run Code Online (Sandbox Code Playgroud)

所以,SpringJdbcTemplate方法将使用RowMapper您提供和调用它的mapRow方法来创建预期收益目标.

您可能希望将Martin Fowler的数据映射器表数据网关结合使用,以了解这些内容如何分布并提供低耦合.