【问题标题】:Strategy to map SQL results to java objects将 SQL 结果映射到 java 对象的策略
【发布时间】:2011-07-23 10:46:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java jdbc jdbctemplate


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好吧,好吧。我想我会写的对象比。我担心我会偏离任何体面的设计结构。但是你的推理非常有道理......谢谢:-)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 好吧,我在其他项目中使用了“真正的”ORM(Hibernate),但是在这个项目中,我过于依赖直接 SQL ;-)。当然,我不需要额外的类只是为了额外的加入,但是 group by + 聚合函数呢......
    • 我自己没用过,但你可能想检查一下MyBatis。在那里你自己的话:“要使用 MyBatis 数据映射器,你依赖于你自己的对象、XML 和 SQL。几乎没有你不知道的东西要学习。有了 MyBatis 数据映射器,你就拥有了全部的力量触手可及的 SQL 和存储过程。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多