加载并注册驱动
加载驱动,把驱动类加载到内存
注册驱动,把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。
1 Driver接口
Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
- MySQL:mysql.jdbc.Driver
- SQLServer:microsoft.sqlserver.jdbc.SQLServerDriver
- Oracle:jdbc.driver.OracleDriver
2编写加载与注册驱动的代码
1)直接创建Driver接口的实现类对象
例如:
Driver driver = new com.mysql.jdbc.Driver(); //因为与mysql驱动包中的类发生直接依赖,所以这样可移植性不够好 |
2)DriverManager 类的 registerDriver()
在实际开发中,程序中不直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
DriverManager 类是驱动程序管理器类,负责管理驱动程序。
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例。
//DriverManager.registerDriver()方式注册驱动,还是依赖 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); |
3)Class.forName()或ClassLoader对象.loadClass()
因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例,所以可以换一种方式来加载驱动。(即只要想办法让驱动类的这段静态代码块执行即可注册驱动类,而要让这段静态代码块执行,只要让该类被类加载器加载即可)
调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
//1、通过反射,加载与注册驱动类,解耦合(不直接依赖) Class.forName(“com.mysql.jdbc.Driver”); |
//2、通过类加载器加载驱动类,解耦合(不直接依赖) ClassLoader.getSystemClassLoader().loadClass(“com.mysql.jdbc.Driver”); |
4)服务提供者框架(例如:JDBC的驱动程序)自动注册(有版本要求)
符合JDBC 4.0规范的驱动程序包含了一个文件META-INF/services/java.sql.Driver,在这个文件中提供了JDBC驱动实现的类名。例如:mysql-connector-java-5.1.40-bin.jar文件中就可以找到java.sql.Driver文件,用文本编辑器打开文件就可以看到:com.mysql.jdbc.Driver类。
JVM的服务提供者框架在启动应用时就会注册服务,例如:MySQL的JDBC驱动就会被注册,而原代码中的Class.forName(“com.mysql.jdbc.Driver”)仍然可以存在,但是不会起作用。
但是注意mysql-connector-java-5.0.8-bin.jar版本的jar中没有,如下