我是否必须在java中的每个方法中编写Class.forname(“com.mysql.jdbc.Driver”)?

时间:2011-08-20 12:55:08

标签: java jdbc

在编写与数据库交互的应用程序时,我能使其工作的唯一方法是在每个与数据库交互的方法中编写Class.forName("com.mysql.jdbc.Driver")

这是唯一的方法吗?还是有更简单的方法?

2 个答案:

答案 0 :(得分:7)

这条线不可行。 jdbc:mysql://localhost/phone_book不是有效的类名。执行此方法时,您将获得异常。

如果您的意思是Class.forname("com.mysql.jdbc.Driver"),它所做的就是确保类加载器加载该类。加载类时,将执行其静态块,此静态块将MySQL驱动程序注册到JDBC API。做一次就足够了。加载一个类后,它就被加载了。第二次加载它不会改变任何东西。

答案 1 :(得分:3)

调用Class.forName(<jdbcDriverClass>)用于加载JDBC驱动程序(实现java.sql.Driver接口)。加载JDBC驱动程序类会导致在Driver内调用静态初始化程序,并且大多数(如果不是全部)所有驱动程序都在静态初始化程序中调用DriverManager.registerDriver(jdbcDriverInstance)

相关的方法调用用于向DriverManager注册JDBC驱动程序,允许DriverManager.getConnection方法返回与JDBC驱动程序支持的数据库的连接。每个JDBC驱动程序只识别一个/一些JDBC URL连接格式,当您调用DriverManager.getConnection(...)时,DriverManager类循环遍历注册的所有驱动程序,并且只循环识别连接URL格式的驱动程序将返回连接。

通过上面的说明,Class.forname("jdbc:mysql://localhost/phone_book")在这种情况下没有任何意义,因为jdbc:mysql://localhost/phone_book不是JDBC驱动程序类。相反,它是一种连接URL格式。由于您对访问MySQL数据库实例感兴趣,因此应使用MySQL Connector / J驱动程序的驱动程序类:Class.forName("com.mysql.jdbc.Driver")。当您需要访问数据库实例时,您应该将JDBC URL用作:DriverManager.getConnection("jdbc:mysql://localhost/phone_book");。您可以使用DriverManager.getConnection(...)方法的三参数变体传递用户ID和密码。