我使用JDBC(和spring-jdbc的jdbcTemplate)来访问java Web应用程序中的数据库。我有很多不同的变化查询,其中一些是我加入到那里的表,一个是子查询,一个是在这里使用组等等。
我经常需要结果来显示由JSP生成的特定表,所以我可以使用方便的queryForList方法返回List<Map<String, Object>>
,一个List,每行由映射列的映射表示名称到值。在JSP中这很好,无论如何都没有编译时类型检查,eclipse没有代码完成属性等。
但有时我有java代码来处理查询结果,我认为不使用map会有所帮助,但是对于真实对象,主要是为了让编译时检查属性是否真的存在,具有正确的类型和当然要完成代码。
但是,如果我想要,我需要为每个查询编写一个Object,这可能是许多对象(除了setter和getter之外只有代码页)。
处理这种情况的最佳方法是什么?只是写那些darn对象?或者有更好的方法吗?
答案 0 :(得分:3)
...不使用地图会有所帮助,但对于真实物体, 主要是为了让编译时检查属性是否真的 存在,具有正确的类型,当然还有代码完成。
您希望编译器理解您的对象模型,因此(至少在Java中)您需要创建它,我担心。
一个不错的IDE将提供从成员变量为您生成get / set方法的选项,这可以节省时间。如果对象模型纯粹存在于JDBC查询而不是业务逻辑上应用某些语义,那么公共成员可能是合适的,从而避免需要采用J2EE Transfer Object模式样式的getter和setter。请注意那里的业务逻辑,并且不要忘记equals() and hashCode()。
在Spring JDBC中,有一些帮助可用于与对象进行映射,例如RowMapper和MappingSqlQuery。您可能还想查看像Spring ORM这样的对象关系映射框架,以节省一些精力。我认为这些方法节省了在SQL中编写转换代码,管理事务和数据库模式的时间 - 我们仍然需要创建对象模型。
答案 1 :(得分:0)
正如Brabster所提到的,RowMapper和MappingSQLQuery可以帮助您将sql结果集转换为对象。但我知道你担心的是你并不总是从查询中提取整个对象,有时你提取对象的组合(通过做sql连接)。
因此,如果我理解正确,您基本上想知道是否还必须为这些对象组合创建类?
简单的答案是否定的,你不需要为每种类型的连接查询创建自定义类,但是如果没有正确的ORM,你必须为每种类型的连接提供RowMappers(注意ORM中的M)代表映射)。由于spring的JDBC框架不是ORM,它会要求您为每个查询提供映射逻辑。如果这听起来太多了,欢迎来到ORM世界:)