创建一个自定义映射器,该映射器将使用DB中的行,直到id更改为止



我从事JDBC项目,需要从ResultSet中获取对象。

这是我的getAll((方法

public List<Person> getAll() throws DaoException {
List<Person> persons = new ArrayList<>();
try (Connection connection = connectionProvider.getConnection();
PreparedStatement statement = connection.prepareStatement(getQueryToGetAll(), Statement.RETURN_GENERATED_KEYS)) {
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {               
students.add(mapper.mapRow(resultSet));  // here I get person from the mapper
}
return persons;
} catch (
SQLException e) {
throw new DaoException("Couldn't get all persons" + persons, e);
}
}

我的模型人物有字段集:

class Person {
private int id;
private String name;
private Set<Activity> activities;
}

我需要从ResiltSet中获得这个集合,也需要使用单个联接查询。

我对DB的查询为我获取下一个数据:链路

所以我的问题是我的映射器不能正常工作。它应该使用行,直到person_id更改以生成单个person实例。

映射器方法:


public Person mapRow(ResultSet resultSet) throws SQLException {
Integer id = resultSet.getInt("person_id");
String name= resultSet.getString("person_name");
Set<Activity> activities = new HashSet<>();
do {
Integer activityId = resultSet.getInt("activity_id");
String activityName = resultSet.getString("activity_name");
activities.add(new Activity(activityId, activityName));
} while (resultSet.next() && id.equals(resultSet.getInt("person_id")));
return new Person(id, name, activities);
}

试试这样的东西:

public List<Person> getAll() throws DaoException {
Map<Integer, Person> personMap = new HashMap<>();
try (Connection connection = connectionProvider.getConnection();
PreparedStatement statement = connection.prepareStatement(getQueryToGetAll(), Statement.RETURN_GENERATED_KEYS)) {
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
mapper.appOrUpdatePersonFromRow(resultSet, personMap);  // here I get person from the mapper
}
return new ArrayList<>(personMap.values());
} catch (
SQLException e) {
throw new DaoException("Couldn't get all persons" + new ArrayList<>(personMap.values()), e);
}
}
public void appOrUpdatePersonFromRow(ResultSet resultSet, Map<Integer, Person> personMap) throws SQLException {
Person person = getOrCreatePerson(resultSet, personMap);
Integer activityId = resultSet.getInt("activity_id");
String activityName = resultSet.getString("activity_name");
person.getActivities().add(new Activity(activityId, activityName));
}
public Person getOrCreatePerson(ResultSet resultSet, Map<Integer, Person> personMap) {
Integer id = resultSet.getInt("person_id");
if(!personMap.containsKey(id)) {
String name= resultSet.getString("person_name");
Person person = new Person(id, name, new HashSet<>());
personMap.put(id, person);
}
return personMap.get(id);
}

最新更新