假设我们在一个对象中有一个对象。假设我们有引用owner_id的数据库表car和所有者表。
我们的域对象汽车引用人员:
public class Car {
public class Person person;
}
假设我们有一个用于Car的DAO和一个用于Person的DAO,可以在CarDao中自动装载PersonDao,并从CarDao的RowMapper中查询Person并将其添加到car对象中吗?我测试了这个并且它有效,但是我要求更多,如果它被认为是不好的形式或做法以及为什么。
答案 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的结果。