Class.forName()的作用仅仅是加载一个类,并且返回该类对应的一个class对象。
原本是用来做反射时使用的类和方法,但是在jdbc中为什么需要使用呢?
这个不得不提到jdbc的机制,jdbc本身仅仅是一套接口,接口中是没有实现数据库的连接的,同时,jdbc使用DriverManager类来代理真正的Driver类,真正的连接的实现需要依靠数据库厂商提供的jdbc驱动包。
当我们导入驱动jar包之后,需要通过class.forName()来加载驱动Driver类注入到JDBC的DriverManager类中。
那么实现的方式是什么?
实际上,Class.forName()仅仅只是加载了一个类,但是,一个类被虚拟机加载之后,会执行静态代码块。
在明白了JDBC驱动加载的流程之后,我们就可以自己写一个jdbc的驱动包了。
所以,这里我们可以模拟一下jdbc驱动包。
一、实现jdbc驱动必不可少的Driver类
因为java.sql.Driver接口的抽象方法实在太多,这里只演示测试用的代码,其他非关键代码不会贴出
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.Properties;
import java.util.logging.Logger;public class MyDriver implements Driver{static {//在静态代码块中注册MyDrivertry {DriverManager.registerDriver(new MyDriver());System.out.println("注册MyDriver到DriverManager");} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic Connection connect(String url, Properties info) throws SQLException {// TODO Auto-generated method stubSystem.out.println("MyDriver产生一个假的Connection对象");return new MyConnection();}}
这个是Connection的模拟类
import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;public class MyConnection implements Connection{@Overridepublic PreparedStatement prepareStatement(String sql) throws SQLException {System.out.println("MyDriver产生一个假的PreparedStatement对象");return null;}
}
现在来测试一下我们的假驱动吧
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class Demo2 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//加载驱动Class.forName("com.yc.test.MyDriver");//创建连接Connection conn = DriverManager.getConnection("iris");//获取StatementSystem.out.println(conn.prepareStatement("sql"));}}
运行结果:
顺便贴一下DriverManager的简单实现,实际上的实现套用的设计模式更多,这里就当做伪代码参考一下就好
package com.yc.test;import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Properties;public class MyDriverManager {private static Driver driver;//注册驱动public static void registerDriver(Driver driver){MyDriverManager.driver = driver;}//获取连接public static Connection getConnection(String url,String user,String pwd) throws SQLException{Properties pro = new Properties();pro.setProperty("user", user);pro.setProperty("password", pwd);return driver.connect(url,pro);}}