Spring JDBCTemplate:在RowMapper中调用DAO方法是否可以?

时间:2014-05-17 06:13:42

标签: java spring dao

假设我们在一个对象中有一个对象。假设我们有引用owner_id的数据库表car和所有者表。

我们的域对象汽车引用人员:

public class Car {
    public class Person person;
}

假设我们有一个用于Car的DAO和一个用于Person的DAO,可以在CarDao中自动装载PersonDao,并从CarDao的RowMapper中查询Person并将其添加到car对象中吗?我测试了这个并且它有效,但是我要求更多,如果它被认为是不好的形式或做法以及为什么。

2 个答案:

答案 0 :(得分:3)

我肯定会把它归类为坏形式,因为数据库调用应该是单数。

您可以尝试从两个调用中调用DAO并编写Car实例

List<Car> cars = carDao.getCars();
List<Person> people = personDao.getPeople();
for (int i=0; i<cars.size(); i++){
    cars.get(i).setPerson(people.get(i));
} 

或创建一个连接查询,生成所需的所有结果,并在RowMapper中创建适当的对象:

jdbcTemplate.query("SELECT c.name, c.serialNumber, p.name FROM Car c INNER JOIN Person p ON c.id = p.carId", .., .., new RowMapper<Car> {
    public Car mapRow(ResultSet rs, int rowNum) throws SQLException {
        String carName = rs.getString(1);
        String carSerialNumber = rs.getInt(2);
        String personName = rs.getString(3);
        Car car = new Car();
        car.setName(carName);
        car.setSerialNumber(serialNumber);
        Person person = new Person();
        person.setName(personName);
        car.setPerson(person);
        return car;
    }
});

注意:我按原样编写代码并且没有对其进行测试,但是这是我使用JDBC的方式。

答案 1 :(得分:2)

IMO这不是一个好习惯。如果要从数据库中提取一对多关系,可以使用ResultSetExtractor

public class MasterDetailResultSetExtractor implements ResultSetExtractor {

  @Override
  public Object extractData(ResultSet rs) throws SQLException {
    Master m = new Master();
    m.setFirstName(rs.getString(1));
    m.setLastName(rs.getString(2));

    //put the master in a map

    Detail d = new Detail();
    d.setSomeProp(rs.getString(3));

    //check if the master is in the map
        //if yes - add the detail to the master
        //if no - add the master first
    return m;
  }

} 

ResultSet是表格JOIN的结果。