如何解决创建一个自定义映射器,它将使用 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 获取此集合。
所以我的问题是我的映射器不能正常工作。它应该消耗行直到 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,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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。