纯 JDBC / Java 中的 DAO 教程 [关闭]

Posted

技术标签:

【中文标题】纯 JDBC / Java 中的 DAO 教程 [关闭]【英文标题】:DAO tutorial in pure JDBC / Java [closed] 【发布时间】:2013-03-16 12:13:57 【问题描述】:

我正在寻找有关如何在纯 Java/JDBC 中实现 DAO 层的教程/最佳实践示例。

大多数 DAO 是否基于 Data Mapper 模式?

是否也使用了 Active Record 模式?

你是怎么做到的?

【问题讨论】:

我看到 DAO 主要使用 Data Mapper。您可以通过将结果集(从查询中获得)转换为您的域对象来实现。 好的,我如何允许我的应用程序的其他层仅使用我的库提供的 API 有效地迭代 100k 表?如果这些结果必须被过滤/排序/分页怎么办?我要创建一个专用的迭代器类吗? 我认为你的 dao 接口应该是这样的,你总是返回域对象或域对象的列表或集合(来自 java util)。为此,您必须解析结果集并进行适当的转换。然后你的其他层与 dao 对话,取回你的域对象并使用它们。 所以换句话说,要遍历 100k 表,我必须将所有 100k 行加载到一些 List/Set 实现中并将其返回给用户? 不,这不是我的意思。我的观点是你的其他层从不与任何 JDBC 组件通信,并且使用标准的 java 库。如果您想返回较少数量的记录(如分页),您可以创建接受下限和上限的 dao 方法,您可以将其传递给查询以返回适当的记录。 【参考方案1】:

DAO 唯一需要的就是接口和实现。你的接口定义了操作,实现提供了实现。

DAO 的特殊之处在于接口和实现的目的是专门的数据访问。您的应用程序处理数据访问的方式隐藏在您的 DAO 抽象之后。

假设您在网上看到了一些 jdbc 代码。您想在 dao 中使用该代码。

Statement st = conn.createStatement();
st.executeUpdate("INSERT INTO sometable " +
                   "VALUES (...)");

所以创建一个接口

interface ThingDao 
   public void save(Thing thing);

和你的实现

public ThingDaoImpl implements ThingDao 

    ThingDaoImpl() 
        // do setup around connections
    

    public void save(Thing thing) 
        // put the jdbc code here
    


现在假设你想让你的生活更轻松,并使用 Spring 的 JdbcTemplate 之类的东西。 DAO 模式不会改变。唯一的变化是在您的实现中,您将使用模板来执行操作。这很重要,因为这意味着任何使用您的 Dao 的代码都不必更改,因为您没有更改界面。这就是 DAO 抽象的要点

【讨论】:

【参考方案2】:

如果您想要无痛的 JDBC,这里是我最喜欢的解决方案...Spring JDBC Template documentation

不过,您仍然需要了解 Spring

【讨论】:

他不是这么问的。 您对如何实现 DAO 的描述包含在 Spring 的 JDBC 文档的“最佳实践”一章中......重点是说“嘿,您不必从从头开始,您可以使用 Spring 的 JDBC 模板,而不是重新发明 Spring 已经做得更好的东西”【参考方案3】:

有好书,例如:

JDBC Metadata, mysql, and Oracle Recipes A Problem-Solution Approach

JDBC Recipes A Problem-Solution Approach

查看How do I implement a DAO manager using JDBC and connection pools?的答案

【讨论】:

以上是关于纯 JDBC / Java 中的 DAO 教程 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JPA & JDBC 可以在 DAO 层共存吗?

使用 JDBC PreparedStatement 返回 MySql 中生成的键

在Java WEB的DAO层开发中关于DAO接口的使用,求解答

DAO 模式 - 它提供业务对象还是纯数据?

DAO 层可以返回一个 JDBC ResultSet (Java)

Java通过JDBC 进行Dao层的封装