使用Spring Rowmapper对象建模数据库实体

时间:2011-08-20 15:48:21

标签: java database spring orm entity

我正在为数据库驱动的应用程序创建前端,并且可以提供一些建议。我的数据库中有以下基本实体:

  • 方面
  • aspect_value

由于你可以成像,我可以为每个方面提供许多方面价值,这样当用户记录方面时,他们可以为每个方面选择多个值......简单。

我已经创建了一个POJO实体来模拟每个方面我的问题是这个...使用Spring和jdbcTemplate我如何能够使用org.springframework.jdbc.core.RowMapper创建所需的复合关系,即每个包含一个或多个方面值对象的方面对象?对于这个问题,如果你能告诉我这是否是最好的方法,我将不胜感激。我非常希望能够更深入地研究ORM,但到目前为止,我遇到的问题已经被推迟了,这些问题已经减缓了我的开发速度并导致决定使用jdbcTemplate。

由于

2 个答案:

答案 0 :(得分:4)

如果要将aspect_values作为对象存储在Aspect对象中,则可以使用RowMapper。每次调用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 :(得分:1)

RowMapper接口提供了一个方法

Object mapRow(ResultSet rs,
          int rowNum)
          throws SQLException

您在类中实现此方法,并提供代码以使用ResultSet rs行中保存的值填充实体对象。要从数据库获取结果集本身,可以使用JdbcTemplate.select方法的重载

List jdbcTemplate.query(String sql, RowMapper mapper )