使用spring指定行ID来构造对象,从数据库构造对象

时间:2011-03-24 19:22:43

标签: java spring orm constructor

要简化这个问题,是否有可能使spring表现为非常基本的活动记录模式

背景:

我的系统有多种类型的现有数据模型,所有数据都存储在只读表中。当用户将数据输入系统时,使用UID将输入与现有行进行比较,以使输入数据与现有数据相匹配。

问题:

我想使用spring从现有数据构造对象进行比较,这样我就可以轻松添加和配置数据模型。我不想使用hibernate或任何其他复杂的ORM,因为我只需要读访问权限,并希望系统尽可能简单轻巧,所以我正在考虑一个简单的spring jdbc模板。

我应该如何传递importId来构造对象?我可以创建一个setter方法,但是我必须调用构造函数并且有一个空的对象,直到我设置id,此时我开始初始化其他变量,这看起来很尴尬。有没有标准的方法来做到这一点?我怀疑我可能会遗漏一些明显的东西。这样做还有其他建议吗?

不会陷入代码陷阱,从现有数据构造的对象类的示例可能是:

public class Import extends Model {
    private JdbcTemplate mJdbcTemplate;
    private int mImportId;
    public Import(int importId, JdbcTemplate template) {
        this.mImportId = importId;
        this.mJdbcTemplate = jdbcTemplate;
        ...
        // construct object form fields
        ... 
    }
    ... 
    // Other stuff
    ... 
} 
<beans>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean> 
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    ...
    data source setup
    ...
    </bean>
    <bean id="import" class="package.models.Import">
        <constructor-arg ref="jdbcTemplate"/>
        ... what to do here...
    </bean>
</beans>

1 个答案:

答案 0 :(得分:2)

你需要什么工具是一个RowMapper for Object,然后你可以使用jdbcTemplate.queryForObject方法。

public Import getImportById(long id) {
       return jdbcTemplate.queryForObject(
          "Select a, b FROM import WHERE id = ?",
          this.importRowMapper,
          id);
}


private RowMapper<Import> importRowMapper = new RowMapper<Import>() {    
    public Customer mapRow(ResultSet resultSet, int i) throws SQLException {
      long id = resultSet.getInt("id");
      String a = resultSet.getString("a");
      String b = resultSet.getString("b");
      return new Customer(id, a, b);
    }

你可以看一下这个博客:Green Beans: Getting Started with Spring in your Service Tier,它对此有所描述。 (此博客的最后一部分仅涉及JPA。