将SQL结果映射到java对象的策略

时间:2011-07-23 10:46:28

标签: java jdbc jdbctemplate

我使用JDBC(和spring-jdbc的jdbcTemplate)来访问java Web应用程序中的数据库。我有很多不同的变化查询,其中一些是我加入到那里的表,一个是子查询,一个是在这里使用组等等。

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

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

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

处理这种情况的最佳方法是什么?只是写那些darn对象?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

  

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

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

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

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

答案 1 :(得分:0)

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

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

简单的答案是否定的,你不需要为每种类型的连接查询创建自定义类,但是如果没有正确的ORM,你必须为每种类型的连接提供RowMappers(注意ORM中的M)代表映射)。由于spring的JDBC框架不是ORM,它会要求您为每个查询提供映射逻辑。如果这听起来太多了,欢迎来到ORM世界:)