优秀的编程知识分享平台

网站首页 > 技术文章 正文

JDBC-驱动注册(jdbc注册驱动三种方式)

nanyue 2024-09-06 20:26:14 技术文章 7 ℃

今天没有什么太多的感悟,分享下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()方法用来加载驱动。

加载驱动的方式有:

      1. 读取System.property中key值为jdbc.drivers的指定驱动列表
      2. 通过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下指定了驱动类

以上就是浅显的驱动加载注册的过程,欢迎大家评论指教。

最近发表
标签列表