4

我正在使用 JDBC(和 spring-jdbc 的 jdbcTemplate)在 Java Web 应用程序中访问我的数据库。我有许多不同的查询,其中一些我加入到那里的表中,一个带有子查询,一个使用 group by here 等等。

通常我只需要结果来显示由 JSP 生成的特定表,因此我可以使用方便的 queryForList 方法返回 a List<Map<String, Object>>,一个 List ,每行由将列名映射到值的映射表示。在 JSP 中这很好,反正没有编译时类型检查,eclipse 等属性没有代码完成。

但有时我有 java 代码来处理查询结果,我认为不使用地图而是使用真实对象会很有帮助,主要是为了让编译时检查属性是否真的存在,是否具有正确的类型,当然还有有代码完成。

但是,如果我想要,我需要为每个可能是许多对象的查询编写一个对象(只有 setter 和 getter 的代码页)。

处理这种情况的最佳方法是什么?只写那些该死的东西?或者,还有更好的方法?

4

2 回答 2

3

...不使用地图而是使用真实对象会很有帮助,主要是为了让编译时检查属性是否真的存在,是否具有正确的类型,当然还有代码完成。

您希望编译器理解您的对象模型,因此(至少在 Java 中)您需要创建它,恐怕。

一个体面的 IDE 将提供从成员变量为您生成 get/set 方法的选项,这可以节省时间。如果对象模型的存在纯粹是为了在 JDBC 查询上应用一些语义而不是业务逻辑,那么公共成员可能是合适的,从而避免了对 J2EE传输对象模式风格的 getter 和 setter 的需要。只需注意那里的业务逻辑,不要忘记equals() 和 hashCode()

不过,在 Spring JDBC 中,有一些帮助可用于在对象之间进行映射,例如RowMapperMappingSqlQuery。您可能还想查看像Spring ORM这样的对象关系映射框架,以节省一些精力。我认为这些方法节省了编写与 SQL 之间的转换代码、管理事务和数据库模式的时间——我们仍然需要创建对象模型。

于 2011-07-23T10:54:29.103 回答
1

正如 Brabster 所提到的,RowMapper 和 MappingSQLQuery 可以帮助您将 sql 结果集转换为对象。但我知道您担心的是您并不总是从查询中提取整个对象,有时您会提取对象的组合(通过执行 sql 连接)。

因此,如果我理解正确,您基本上想知道您是否也必须为这些对象组合中的每一个创建类?

简单的答案是否定的,您不需要为每种类型的联接查询创建自定义类,但是在没有适当的 ORM 的情况下,您必须为每种类型的联接提供 RowMappers(请注意,ORM 中的 M 代表映射)。由于 Spring 的 JDBC 框架不是 ORM,它要求您为每个查询提供映射逻辑。如果这听起来工作量太大,欢迎来到 ORM 世界 :)

于 2011-07-23T19:40:43.287 回答