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

标签 java database spring orm entity

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

  • 方面
  • 方面值(value)

正如您想象的那样,我可以为每个方面设置多个方面值,这样当用户记录一个方面时,他们可以为每个方面选择多个值...很简单。

我已经创建了一个 POJO 实体来对每个方面进行建模,我的问题是......使用 Spring 和 jdbcTemplate 我将如何使用 org.springframework.jdbc.core.RowMapper 创建所需的复合关系,即每个包含一个或多个方面值对象的方面对象?就此而言,如果您能告诉我这是否是最好的方法,我将不胜感激。我很想在某个时候更深入地研究 ORM,但到目前为止,我遇到的问题数量已经拖延了我的开发速度,并导致我决定改用 jdbcTemplate。

谢谢

最佳答案

如果将 aspect_values 作为对象存储在 aspect 对象中,则可以使用 RowMapper。每次调用 RowMapper 都会返回一个对象,因此您最终会得到 aspect_values 的集合。如果您需要使用 aspect_value 表中包含的值构建一个(或多个)方面对象,那么 ResultSetExtractor 是更好的选择。

这是我 promise 的例子。我必须手动输入这些内容,因为我们的开发网络仅在内部网络上,因此任何打字错误都是复制错误,而不是代码中的错误。这些是我的 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;
  }

}

关于java - 使用 Spring Rowmapper 对象对数据库实体建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132837/

相关文章:

java - 在以下代码中使用 map 时出错

java - 登录后丢失 session

database - 将唯一访问者存储在分布式数据库中

java spring bean注册

java - Spring Boot 触发完全重启,而不是在静态文件发生更改时重新加载

java - 有多少人被 Java 子串内存问题坑过?

java - 如何分配 <s :property value ="a"> value to a jsp variable

c# - 如何使用 ADO.NET 创建 Microsoft SQL Server 数据库?

c++ - sqlite 数据库保持锁定/不可访问

java - Spring 3.2 对泛型类型的验证