【问题标题】:Why is JDBC dynamically loaded instead of imported? [duplicate]为什么 JDBC 是动态加载而不是导入的? [复制]
【发布时间】:2018-11-19 22:53:40
【问题描述】:

在 JDBC 中,我只看到使用示例

Class.forName("com.mysql.jdbc.Driver", true, cl);

还没看到有人用过

import com.mysql.jdbc.Driver;

是不是因为我们想让一个驱动包在执行时动态提供,所以只能在执行时知道?

如果我们在执行之前有一个已知的固定驱动程序包,是否可以采用第二种方式?您如何比较这两种方式?

谢谢。

【问题讨论】:

  • 可以使用特定于供应商的类。 JDBC API 的主要设计目的是提供一种以与供应商无关的可移植方式与数据库交互的标准方式。
  • 您的意思是使用import com.mysql.jdbc.Driver; 意味着我必须使用特定于vencor 的类吗? import com.mysql.jdbc.Driver; 不能和 JDBC API 一起使用吗?
  • 您永远不需要直接使用 Driver 类,它不是 API 的成员 - 只是提供实际接口实现的东西。主要 API 由DriverManagerConnectionStatementResultSet 组成。现在,您不需要直接加载 Driver 类,而是使用 DriverManager#getConnection 和适当的 String 参数。

标签: java jdbc import dynamic-loading


【解决方案1】:

我只看到使用示例

那么您正在阅读有关 JDBC 的非常古老的东西。这在很长一段时间内都不再有用了。在尝试这样做之前,有必要加载驱动程序类以确保加载了必要的驱动程序,并且能够处理与提供的数据库 URL 的连接。

JDBC 抽象是您访问数据库所需要的全部内容,您不必关心您是在处理 MySQL 驱动程序还是 Oracle 驱动程序,或者其他什么。在运行时动态加载驱动程序,允许从编译类路径中删除驱动程序 jar 文件,并确保您只依赖标准 JDBC 类和接口。

请注意,除了允许您在代码中使用简单的类名之外,导入类不会做任何事情。它不等同于加载和初始化一个类,这是第一个 sn-p 所做的。

【讨论】:

  • 谢谢。 (1) 你能告诉我关于 JDBC 的新东西是什么吗? (2)“导入一个类除了允许你在代码中使用简单的类名外,什么都不做。它不等同于加载和初始化一个类”。你能否举一些例子来说明这一点,并解释什么时候我需要加载和初始化一个类,什么时候不需要?
  • 1.官方 JDBC 教程,它回答了你的问题,顺便说一句:docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html。 2. 您基本上不必以这种方式加载和初始化一个类。这是一个不再使用的 hack。
  • 如果驱动程序不在初始类路径中,Class.forName() 仍然是必需的。例如,如果打包在 WAR 中,则它位于 Web 应用程序的上下文类路径中,需要显式加载。但话又说回来,对于这些类型的应用程序,应该使用javax.sql.DataSource 代替任何方式。
  • 不使用Class.forName("com.mysql.jdbc.Driver", ...)com.mysql.jdbc.Driver会被动态加载吗?如果是,怎么做?
  • 是的,但是这个 URL 可以(并且经常)外部化到一些属性文件中。我的观点是:你不应该让你的代码依赖于特定的专有驱动程序类,并且使用反射加载一个类来触发驱动程序的注册是一种多年来没有必要的黑客攻击。
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多