JDBC:与数据库无关

Posted

技术标签:

【中文标题】JDBC:与数据库无关【英文标题】:JDBC: Database Agnostic 【发布时间】:2012-09-20 05:43:09 【问题描述】:

JDBC 在它的文档中指出它有 4 个实现来连接到数据库。我不太明白这 4 个实现是什么意思,我想知道 JDBC 是否真的与数据库无关。也就是说,对于每种类型的数据库,我是否需要“驱动程序”,例如 mysql (jConnector)?

我正在编写一个支持 Oracle、MySQL 和 MSSQL 的应用程序。

参考: http://docs.oracle.com/javase/tutorial/jdbc/basics/gettingstarted.html

谢谢

【问题讨论】:

【参考方案1】:

不幸的是,您将需要所有数据库类型的驱动程序。

如果您想真正与数据库无关,则需要使用 JPA:

http://en.wikipedia.org/wiki/Java_Persistence_API

使用它的一种实现。最受欢迎的一种是 Hibernate:

http://en.wikipedia.org/wiki/Hibernate_%28Java%29

【讨论】:

我明白了 - 但我没有得到,如果它需要驱动程序,那么它怎么可能与数据库无关?我不明白那部分。感谢您的回答 - 这只是元信息 JB Nizet 以非常简单的方式解释了这一点。 API 并不关心你使用什么数据库——但你需要让你的数据库理解 API——这就是你需要驱动程序的原因。 MySQL、Oracle 和 MS SQL 的 SQL 之间也存在差异。 JPA 可以帮助您解决这些问题。您仍然需要为您的 JPA 使用特定方言(但您不必更改代码)。 谢谢,感谢您的回答。【参考方案2】:

使用 JDBC 时,您使用的是与数据库无关的 API。此 API 的接口(Connection、Statement 等)由目标数据库的 JDBC 驱动程序实现。因此,如果您使用 Oracle,则需要一个 oracle 驱动程序。

【讨论】:

这是一个有趣的观点。我明白为什么它可能会误导提出问题的人。【参考方案3】:

是的,JDBC API 与数据库无关——您只需提供适当的驱动程序。当然你发的SQL不会是,除非你用JPA

【讨论】:

【参考方案4】:

JDBC 在其文档中指出它有 4 个实现来连接数据库

不,它没有。它可能表明(当前)有 4 个实现级别。但是实现的数量取决于(至少)目标数据库的数量的迭代次数每个数据库的实现,两者都远大于 4。

【讨论】:

我有点明白你的意思,但是添加少量代码来完成有限或可忽略的工作 (JDBC) 似乎很愚蠢。在 .NET 中,与 DB 的连接和交互仅依赖于“驱动程序”。没有“假定的”不可知论层。我不明白。只需删除 JDBC 并告诉我使用“驱动程序”即可。【参考方案5】:

我已经解释了in this answer 单独使用 JDBC 来真正实现与供应商无关的难度。这有两层:

JDBC 是用于连接数据库的网络协议的一个非常好的抽象。尽管您在这里和那里都需要一些特定于供应商的怪癖。如果您要绑定到单个 RDBMS 供应商,这些怪癖很好,但如果您需要支持多个产品,那就很麻烦了 SQL 是一种非常好的查询语言标准。不过,同样,您在这里和那里都需要很多特定于供应商的怪癖。同上,支持 1 个 RDBMS 及其怪癖是可以的,但很难支持多个。

正如其他人所提到的,JPA/Hibernate 帮助您抽象出一些差异,主要是通过删除对更“高级”SQL 功能的访问(包括派生表、联合等,至少从版本 5 开始)。对于方言之上更以 SQL 为中心的抽象,jOOQ 是一个流行的选项。

免责声明:我为 jOOQ 背后的公司工作。

【讨论】:

以上是关于JDBC:与数据库无关的主要内容,如果未能解决你的问题,请参考以下文章

JDBC是什么?

JDBC

JDBC原理

JDBC原理

JDBC

JAVA-JDBC