Моделирование объектов базы данных с использованием объекта Spring Rowmapper - PullRequest
2 голосов
/ 20 августа 2011

Я нахожусь в процессе создания внешнего интерфейса для приложения, управляемого базой данных, и могу дать несколько советов. В моей базе данных есть следующие основные объекты:

  • аспект
  • aspect_value

Как вы можете изобразить, у меня может быть много значений аспекта для каждого аспекта, так что когда пользователь записывает аспект, он может выбрать более одного значения для аспекта ... просто.

Я создал объект POJO для моделирования каждого аспекта, и мой вопрос заключается в следующем ... используя Spring и jdbcTemplate, как бы я мог создать желаемое составное отношение, используя org.springframework.jdbc.core.RowMapper, т.е. объект аспекта, содержащий одно или несколько объектов аспекта? И в этом отношении я был бы признателен, если бы вы могли сообщить мне, если это будет лучший способ сделать это. В какой-то момент я стремлюсь глубже вникнуть в ORM, но до сих пор меня отталкивает количество проблем, с которыми я столкнулся, что замедлило мою разработку и привело к решению использовать вместо нее jdbcTemplate.

Спасибо

Ответы [ 2 ]

4 голосов
/ 20 августа 2011

Вы можете использовать RowMapper, если вы сохраняете aspect_values ​​в вашем аспектном объекте как объекты.Каждый вызов RowMapper возвращает объект, поэтому вы получите коллекцию aspect_values.Если вам нужно построить объект аспекта (или объекты) со значениями, содержащимися в таблице aspect_value, тогда лучше выбрать ResultSetExtractor.

Вот мои обещанные примеры.Я должен ввести их вручную, потому что наша сеть разработки находится только во внутренней сети, поэтому любые опечатки являются ошибками копирования, а не ошибками в коде.Это сокращенные версии внутренних классов в моем DAO:

. Это сопоставляет одну строку в ResultSet с объектом:

public List<MessageSummary> getMessages(Object[] params)
{
  // mList is filled with objects created in MessageRowMapper,
  // so the length of the list equal to the number of rows in the ResultSet
  List<MessageSummary> mList = jdbcTemplate.query(sqlStr, new MessageRowMapper(),
                                                  params);
  return mList;
}

private final class MessageRowMapper implements RowMapper<MessageSummary>
{
  @Override
  public MessageSummary mapRow(ResultSet rs, int i) throws SQLException
  {
    MessageSummary ms = new MessageSummary();

    ms.setId(rs.getInt("id"));
    ms.setMessage(rs.getString("message"));

    return ms;
  }
}

ResultSetExtractor работает по той же идее, кроме картыВесь набор, а не просто преобразование строки в объект.Это полезно, когда ваш объект имеет атрибуты из нескольких строк.

public Map<Integer, List<String>> getResults(Object[] params)
{
  Map<Integer, List<String>> result = jdbcTemplate.query(sqlStr, new ResultExtractor(),
                                                         params);
  return result;
}

private final class ResultExtractor implements ResultSetExtractor<Map<Integer, List<String>>>
{
  @Override
  public Map<Integer, List<String>> extractData(ResultSet rs)
                                    throws SQLException, DataAccessException
  {
    Map<Integer, List<String>> resultMap = new HashMap<Integer, List<String>>();

    while (rs.next())
    {
      int id = rs.getInt("id");
      List<String> nameList = resultMap.get(id);
      if (nameList == null)
      {
        nameList = new ArrayList<String>();
        resultMap.put(id, nameList);
      }
      nameList.add(rs.getString("name"));
    }
    return resultMap;
  }

}
1 голос
/ 20 августа 2011

Интерфейс RowMapper предоставляет метод

Object mapRow(ResultSet rs,
          int rowNum)
          throws SQLException

Вы реализуете этот метод в классе и предоставляете код для заполнения вашего объекта сущности значениями, содержащимися в строке ResultSet rs.Чтобы получить сам набор результатов из базы данных, вы можете использовать перегрузку метода JdbcTemplate.select

List jdbcTemplate.query(String sql, RowMapper mapper )
...