【问题标题】:What is a proper way to modify a list of DB Objects using Spring MVC?使用 Spring MVC 修改数据库对象列表的正确方法是什么?
【发布时间】:2016-08-29 15:37:28
【问题描述】:

问题

使用 spring MVC 模型并且没有任何 ORM 解决方案,我应该如何处理大量数据库对象而不增加数据库查询?


研究轨迹

轨道 1

  • 第 1 步:SELECT 使用 DAO 的对象并将它们放入(大)ListRowMapper
  • 第 2 步:在 Java 中处理关联服务中的对象。
  • 第 3 步:循环 (n-big) List 以在 DB 中执行 n 个简单的 UPDATE

查询 n 个对象:1 + n

轨道 2

在 DAO 中编写一个 SQL 查询,直接更新所有对应的对象而不提取它们。

查询 n 个对象:1

想法

由于轨道 2 似乎更有效率,它似乎也直接违背了 Spring MVC 模型,因为我的服务将趋于清空,而我的 DAO 将趋于扩展。

也许有一种通用的方法可以在不增加查询的情况下对数据库中的对象的 Java List 执行 UPDATE


简单案例

鉴于此表:

+----+---------+------+
|           MY_OBJECT |
+----+---------+------+
| ID | BOOLEAN | DATE |
+----+---------+------+
|  0 |       0 | NULL |
|  1 |       1 | NULL |
|  2 |       0 | NULL |
|  3 |       1 | NULL |
|  4 |       1 | NULL |
+----+---------+------+

我有一个MyObjectDao 和一个MyObjectService

对于所有布尔值为true 的对象,我想将DATE 设置为SYSDATE()

应该是带有查询的完整 DAO,还是应该由 DAO 检索对象,服务编辑它们,然后 DAO 更新它们?

【问题讨论】:

    标签: java mysql spring-mvc


    【解决方案1】:

    我做了一些研究并对这个问题进行了很多思考。我从工作中得出的结论是,在大多数情况下,流程应该是:

    • 使用 DAO 以通用方式从 DB 中提取数据
    • 使用服务/业务层以您需要的方式编辑对象
    • 将对象传输到 DAO 以执行通用 batchUpdate

    我缺少的关键元素是 batchUpdate。没有它,更新大量 List 元素将需要几分钟,这是不可接受的。最大的区别不是执行的查询数量,而是它们如何传输到数据库,避免在批量更新情况下多次使用网络层。

    【讨论】:

      【解决方案2】:

      这通常由 ORM 层处理。

      如果您使用的是 Hibernate(其他 ORM 可用),那么我会委托给它。

      如果你有自己的自旋 ORM 层,你可以做任何你想做的事,但作为对你的论点的重视,我会说:

      1. 服务应该只知道它想要的分页。
      2. 如何实现这一点应位于服务之下。

      【讨论】:

      • 我没有使用 ORM,我编辑了帖子以添加该详细信息。也就是说,答案并没有真正解决“谁应该做什么”的问题。简单案例:给定一个对象列表,在 DB 中包含 booleanDate。我想将SYSDATE() 设置为所有具有true 布尔值的对象。它应该是带有查询的完整 DAO,还是应该由 DAO 检索对象、服务编辑它们然后 DAO 更新它们?
      • 视情况而定。如果您想避免使用大量繁琐的 SQL 语句,请提取数据并在 Java 对象级别对其进行操作。如果您对使用 SQL 感到满意,那么只需将 SQL 'update where' 语句触发到数据库中。从您的“不增加数据库查询”来看,您可能想要前者。
      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 2017-10-04
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2018-04-12
      相关资源
      最近更新 更多