2013-02-27 13 views
15

Uczę się, jak wykonać zapytanie do bazy danych za pomocą JDBC w Spring Framework.Pewne wątpliwości dotyczące użycia RowMapper w JDBC w aplikacji Spring Framework

śledzę ten tutorial: http://www.tutorialspoint.com/spring/spring_jdbc_example.htm

W tym tutorialu zdefiniować StudentDAO interfejs, który tylko zdefiniować metodę CRUD, że chcę.

Następnie jest zdefiniowana klasa Student, która jest encją, którą chcę zachować w tabeli bazy danych Uczniów.

Następnie definiuje się StudentMapper klasy, która jest specyficzna realizacja RowMapper interfejs, który w tym przypadku jest używany do mapowania konkretny zapis w ResultSet (zwróconego przez kwerendę) do Studenta Obiekt.

Wtedy mam StudentJDBCTemplate że rappresent realizację mojego StudentDAO interfejsu, w tej klasie implementować metody CRUD, który został zdefiniowany w interfejsie.

Ok, a teraz mam wątpliwości, w jaki sposób StudentMapper klasa praca: w tym StudentJDBCTemplate klasie nie definiuje metodę, która zwraca listę wszystkich rekordu, które są w tabeli bazy danych Student, ten jeden:

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

Jak widać, metoda ta zwraca listę obiektów Student i pracy w następujący sposób:

pierwszą rzeczą, że można zrobić, jest zdefiniowanie kwerendy zwrócić wszystkie rekord w St. Udent tabela bazy danych w ciągu SQL.

Potem ta kwerenda jest wykonywana przez wywołanie metody zapytań na obiekcie jdbcTemplateObject (czyli istance z JdbcTemplate wiosennej klasy **

Metoda ta ma dwa parametry: SQL String (zawierający zapytania SQL które muszą zostać wykonane) oraz nowy StudentMapper obiekt, który podejmują ResultSet obiektu zwróconego przez kwerendę i map jest to rekord na nowym obiekcie Student

Czytając tutaj: http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html Sayas że: Ex ecute zapytanie podane static SQL, mapowanie każdego wiersza do obiektu Java za pomocą RowMapper.

Moje wątpliwości związane jest z faktem, że moja StudentMapper mapy rekordu ResultSet na obiekcie Student używając mapRow() metody, jest to kod:

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; 
    } 
} 

Więc, którzy nazywają to metoda mapRow? jest automatycznie nazywany przez Spring Framework? (ponieważ w tym przykładzie nigdy nie jest wywoływana ręcznie ...)

Tnx

Andrea

Potem ta kwerenda jest wykonywana przez wywołanie metody zapytań na obiekcie jdbcTemplateObject (czyli istance z JdbcTemplate wiosennej klasy **

Odpowiedz

22

Po przejechaniu wystąpienie swoimi RowMapper metody

List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper()); 

JdbcTemplateJdbcTemplate zależności od metody jaką nazwie, będzie wewnętrznie użyć mapowania z wyniku ustawić robi z JDBC Połączenie, aby utworzyć obiekt żądanego typu. Na przykład, skoro nazywa JdbcTemplate#query(String, RowMapper), metoda będzie używać SQL String kwerendy pętlę bazy danych i będzie przez każdego „rzędu” w ResultSet rodzaju tak:

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; 

Więc JdbcTemplate metoda Spring „s będzie użyj podanego RowMapper i wywołaj jego metodę mapRow, aby utworzyć oczekiwany obiekt powrotu.

Być może zechcesz spojrzeć na Data Mapper Martina Fowlera w połączeniu z Table Data Gateway, aby dowiedzieć się, jak te rzeczy są rozpowszechniane i dostarczyć low coupling.

1

Więc, kto wywołuje tę metodę MapRow? czy jest automatycznie wywoływany przez Spring Framework ? (ponieważ w tym przykładzie nigdy nie jest nazywany ręcznie ...)

Jest to automatycznie wywoływane przez ramy wiosenne. co potrzebne jest, aby określić

  1. parametry podłączeń
  2. instrukcji SQL
  3. parametry deklarują i zapewniają wartości parametrów
  4. do pracy dla każdej iteracji.
4

Oto typowy wzór, którego używam w BeanPropertyRowMapper. Pozwala to zaoszczędzić sporo kodu. Twoje zapytanie musi aliasować każdą kolumnę, aby pasowała do nazwy właściwości w klasie. W tym przypadku species_name as species i inne nazwy kolumn są już zgodne.

public class Animal { 
    String species; 
    String phylum; 
    String family; 
    ...getters and setters omitted 
} 

@Repository 
public class AnimalRepository { 
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate; 

    @Autowired 
    public void setDataSource(DataSource dataSource) { 
     this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); 
    } 

    public List<Animal> getAnimalsByPhylum(String phylum) { 
     String sql = " SELECT species_name as species, phylum, family FROM animals" 
       +" WHERE phylum = :phylum"; 

     Map<String, Object> namedParameters = new HashMap<String, Object>(); 
     namedParameters.put("phylum", phylum); 
     SqlParameterSource params = new MapSqlParameterSource(namedParameters); 
     List<Animal> records = namedParameterJdbcTemplate.query(sql, 
       params, BeanPropertyRowMapper.newInstance(Animal.class)); 

     return records; 
    } 
} 

Alternatywą jest użycie RowMapper (ten przykład używa tylko anonimową klasę), gdy trzeba więcej dostosowanie każdym wierszu:

List<Animal> records = namedParameterJdbcTemplate.query(sql, 
      params, new RowMapper<Animal>(){ 
     public Animal mapRow(ResultSet rs, int i) throws SQLException { 
      Animal animal = new Animal(); 
      animal.setSpecies(rs.getString("species_name")); 
      if (some condition) { 
       animal.setPhylum(rs.getString("phylum")); 
      } else { 
       animal.setPhylum(rs.getString("phylum")+someThing()); 
      } 
      animal.setFamily(rs.getString("family")); 

      return animal; 
     } 
    }); 
2

Korzystanie RowMapper wiosną

import java.sql.ResultSet; 
import java.sql.SQLException; 

import org.springframework.jdbc.core.RowMapper; 

public class RowsMap implements RowMapper<EmpPojo>{ 

    @Override 
    public EmpPojo mapRow(ResultSet rs, int counts) throws SQLException { 
     EmpPojo em=new EmpPojo(); 
     em.setEid(rs.getInt(1)); 
     em.setEname(rs.getString(2)); 
     em.setEsal(rs.getDouble(3)); 

     return em; 
    } 

} 

Finally in Main class 

List<EmpPojo> lm=jt.query("select * from emps", new RowsMap()); 
for(EmpPojo e:lm) 
{ 
    System.out.println(e.getEid()+" "+e.getEname()+" "+e.getEsal()); 
} 
Powiązane problemy