如何设计一个DAO更新方法

Posted

技术标签:

【中文标题】如何设计一个DAO更新方法【英文标题】:how to design a DAO update method 【发布时间】:2014-12-31 14:43:51 【问题描述】:

如何为具有多个字段的实体设计 DAO 类?

例如以下实体:

public class MyEntity

    private long id;
    private int field1;
    private String field2;
    private Date field3;
    private Date field4;
    private int field5;


我是否应该为每个字段创建一个具有更新方法的 DAO 类,例如:

public class MyEntityDao
    public insert(MyEntity myEntity);
    public delete(MyEntity myEntity);    
    public get(long id);
    public updateField1(MyEntity myEntity)
    public updateField2(MyEntity myEntity)
    public updateField3(MyEntity myEntity)
    public updateField4(MyEntity myEntity)
    public updateField5(MyEntity myEntity)


这似乎是合乎逻辑的事情,但我通常会看到单个 update() 方法的示例。在这种情况下,DAO 应该如何确定要更新数据库中的哪个字段?它是否只是盲目地更新所有字段,即使只有 1 个可能已更改?或者实体类应该有标志作为成员来指示哪些字段发生了变化?

【问题讨论】:

【参考方案1】:

您只需要传递实体进行更新,DAO 将自动确定更改的字段并在数据库中更新它们。

public update(MyEntity myEntity);

然后 DAO 获取 myEntity 的 id 并更新数据库中的实体。

【讨论】:

DAO 如何确定哪些字段发生了变化? 你说只传递id,但你的代码传递了实体对象 @faizal:不,您传递的是实体而不是 id(我错了),DAO 将确定该实体的 id,并使用它来更新表中的实体,即使您没有t 更改了任何字段。 那么如果实体中有 20 个字段对应于表中的 20 列,而我的应用程序只更改了 1 个字段,那么 DAO 应该简单地更新所有 20 列吗?好像有点浪费。 我不这么认为!老实说,我所知道的是,当您更新时,DAO 会获取所有实体并引用其 id 会在数据库中进行更改,而不会给它更改的字段。【参考方案2】:

您应该一次更新所有字段。

为什么?: 查询对象最浪费,然后与实际实体进行比较,确定必须更新哪些字段,为每个组合创建不同的 PreparedStatment。最后更新这些字段。

【讨论】:

这意味着每次都要传输大量数据,即使是最小的操作也会对资源造成压力。 反之,当你查询实体的状态时,你必须将所有数据从持久层传输到业务层进行比较。唯一不需要比较的情况是在非并发应用程序中,或者提供某种悲观锁定。您必须确保没有其他线程或用户更改了持久层中的实体以使用您建议的这种方法。而且这种情况非常具体,应该考虑是否真的需要增加这种复杂性来提高性能。

以上是关于如何设计一个DAO更新方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Servlet 中使用 DAO 设计模式方法将用户输入存储到 MongoDB?

javaWeb_JDBC_dao模式设计

如何在使用 jooq 生成的 dao 插入/更新后获取插入/更新的对象

如何使用 LINQ to SQL 创建通用数据访问对象 (DAO) CRUD 方法

使用 EntityManager (JPA) 在 DAO 中更新 () 方法的推荐行为?

在 Ruby 上设计 DAO