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

Posted

技术标签:

【中文标题】使用 Spring Rowmapper 对象对数据库实体进行建模【英文标题】:Modelling Database Entities using Spring Rowmapper Object 【发布时间】:2011-08-20 15:48:21 【问题描述】:

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

方面 aspect_value

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

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

谢谢

【问题讨论】:

【参考方案1】:

如果您将 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;
  


【讨论】:

嗨,Paul,感谢您的回复,您能否提供一个示例...我对这些东西非常了解,并且发现很难找到好的材料 我有几个工作中的例子,我很乐意分享。我最迟会在星期一之前发布它们(因为我现在在家)。【参考方案2】:

RowMapper 接口提供了一个方法

Object mapRow(ResultSet rs,
          int rowNum)
          throws SQLException

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

List jdbcTemplate.query(String sql, RowMapper mapper )

【讨论】:

以上是关于使用 Spring Rowmapper 对象对数据库实体进行建模的主要内容,如果未能解决你的问题,请参考以下文章

Spring Framework应用中JDBC使用RowMapper的一些疑惑

如何使用带有 Spring RowMapper 的 RowSetDynaClass 来检索 ResultSet 的所有行?

使用 Spring JDBC Rowmapper 映射分层数据

spring 中的 RowMapper

Spring使用RowMapper将数据中的每一行封装成用户定义的类

RowMapper问题