mysql加载驱动(driver)的几种方法 jdbc

1.DriverManager.registerDriver(new com.mysql.jdbc.Driver());

缺点:由new com.mysql.jdbc.Driver()可以知道,这里需要创建一个类的实例。创建类的实例就需要在java文件中将该类通过import导入,否则就会报错,即采用这种方式,程序在编译的时候不能脱离驱动类包,为程序切换到其他数据库带来麻烦。实际上这个地方还做了一次无用功,Driver类中本身已经含有静态块将instance放入驱动列表中。(详细说明可以参照mysql的Driver类)

public class Driver extends NonRegisteringDriver implements java.sql.Driver { // ~ Static fields/initializers // --------------------------------------------- // // Register ourselves with the DriverManager // static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } // ~ Constructors // ----------------------------------------------------------- /** * Construct a new driver and register it with DriverManager * * @throws SQLException * if a database error occurs. */ public Driver() throws SQLException { // Required for Class.forName().newInstance() } }



由上可见,在创建Driver类的时候,其实已经调用一次registerDriver方法了、

2,System.setProperty(”jdbc.drivers“,”com.mysql.jdbc.Driver“);
可以脱离驱动包编译,可以同时设置多个驱动,多个驱动之间使用冒号分隔。
3,Class.forName(“com.mysql.jdbc.Driver”);



=================================================================================
使用JDBC时,我们都会很自然得使用下列语句:

java 代码

1.Class.forName("com.mysql.jdbc.Driver");
2.String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
3.String user = "";
4.String psw = "";
5.Connection con = DriverManager.getConnection(url,user,psw);


为什么说很自然呢,因为无论是网上还是书本教程上得例子都是这样的,而且程序也确实正常运行了,于是大家也就心安理得的找葫芦画瓢下去了。
一定要有这一句吗?不是的,我们完全可以用这样一句代替它:


java 代码

https://www.360docs.net/doc/a06267540.html,.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
2.//or:
3.//new com.mysql.jdbc.Driver();
4.String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
5.String user = "";
6.String psw = "";
7.Connection con = DriverManager.getConnection(url,user,psw);
8.


大家可能都看出个大概来了,我们只需要在调用DriverManager的getConnection方法之前,保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了,而具体是怎样实现这个功能却是没有讲究的。上面两种方法都可以实现这个功能,因此程序可以正常

运行。注意了,如果我们进行如下操作,程序是不能正常运行的,因为这样仅仅使Driver类被装载到jvm中,却没有进行相应的初始化工作。

java 代码

https://www.360docs.net/doc/a06267540.html,.mysql.jdbc.Driver driver = null;
2.//or:
3.ClassLoader cl = new ClassLoader(); ====================错误
4.cl.loadClass("com.mysql.jdbc.Driver");


我们都知道JDBC是使用Bridge模式进行设计的,DriverManager就是其中的Abstraction,java.sql.Driver是Implementor,com.mysql.jdbc.Driver是Implementor的一个具体实现(请参考GOF的Bridge模式的描述)。大家注意了,前一个Driver是一个接口,后者却是一个类,它实现了前面的Driver接口。
Bridge模式中,Abstraction(DriverManager)是要拥有一个Implementor(Driver)的引用的,但是我们在使用过程中,并没有将Driver对象注册到DriverManager中去啊,这是怎么回事呢?jdk文档对Driver的描述中有这么一句:
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager
哦,原来是com.mysql.jdbc.Driver在装载完后自动帮我们完成了这一步骤。源代码是这样的:

java 代码

1.package com.mysql.jdbc
2.
3.public class Driver extends NonRegisteringDriver implements java.sql.Driver {
4. // ~ Static fields/initializers
5. // --------------------------------------------- //
6. // Register ourselves with the DriverManager
7. //
8. static {
9. t ry {
10. java.sql.DriverManager.registerDriver(new Driver());
11. } catch (SQLException E) {
12. throw new RuntimeException("Can't register driver!");
13. }
14. }
15.// ~ Constructors
16. // -----------------------------------------------------------
17./**
18. * Construct a new driver and register it with DriverManager
19. *
20. * @throws SQLException
21. * if a database error occurs.
22. */
23. public Driver() throws SQLException {
24. // Required for Class.forName().newInstance()
25. }
26.}

相关文档
最新文档