今天没有什么太多的感悟,分享下jdbc的基础知识吧!欢迎大家留言评论!
JDBC(Java DataBase Connectivity, Java数据库连接) ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。有了JDBC,程序员只需用JDBC API写一个程序,就可访问所有数据库。
JDBC有几个关键的类和接口:
DriverManager类:驱动的管理类,可以注册驱动、注销驱动、查看驱动列表等。
Connection接口:Connection是给定数据库的连接(会话),在一个连接中sql语句会被执行和返回结果,主要包括事务管理、创建Statement等。
Statement接口:用于执行静态SQL语句并返回其产生的结果的对象。
PreparedStatement接口:Statement的子类,预编译sql语句对象接口。一个sql语句被预编译并且存储在PreparedStatement对象中,后续可以高效多次执行该语句。
下面详细的说下DriverManager类的驱动注册过程。
从DriverManager的源码可以看到,有个静态代码块
static {
    loadInitialDrivers();
    println("JDBC DriverManager initialized");
}loadInitialDrivers()方法用来加载驱动。
加载驱动的方式有:
- 读取System.property中key值为jdbc.drivers的指定驱动列表
 - 通过spi的方式,加载路径META-INF/services/java.sql.Driver文件指定的驱动列表
 
private static void loadInitialDrivers() {
    String drivers;
    try {
        drivers = AccessController.doPrivileged(new PrivilegedAction<String>() {
            public String run() {
                // 读取指定驱动列表
                return System.getProperty("jdbc.drivers");
            }
        });
    } catch (Exception ex) {
        drivers = null;
    }
    AccessController.doPrivileged(new PrivilegedAction<Void>() {
        public Void run() {
            // 读取META-INF/services/java.sql.Driver文件指定的驱动列表
            ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
            Iterator<Driver> driversIterator = loadedDrivers.iterator();
            try{
                while(driversIterator.hasNext()) {
                    driversIterator.next();
                }
            } catch(Throwable t) {
            // Do nothing
            }
            return null;
        }
    });
    println("DriverManager.initialize: jdbc.drivers = " + drivers);
    if (drivers == null || drivers.equals("")) {
        return;
    }
    String[] driversList = drivers.split(":");
    println("number of Drivers:" + driversList.length);
    for (String aDriver : driversList) {
        try {
            println("DriverManager.Initialize: loading " + aDriver);
            Class.forName(aDriver, true,
                    ClassLoader.getSystemClassLoader());
        } catch (Exception ex) {
            println("DriverManager.Initialize: load failed: " + ex);
        }
    }
}还可以通过DriverManager.registerDriver()方法注册驱动。
public static synchronized void registerDriver(java.sql.Driver driver,
        DriverAction da)
    throws SQLException {       
    if(driver != null) {
        registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
    } else {
        throw new NullPointerException();
    }
    println("registerDriver: " + driver);
}下面看下mysql的驱动注册加载
mysql的驱动类com.mysql.cj.jdbc.Driver
静态代码块调用DriverManager.registerDriver()
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}同时在路径META-INF/services/java.sql.Driver下指定了驱动类
以上就是浅显的驱动加载注册的过程,欢迎大家评论指教。
