美文网首页
JDBC入门

JDBC入门

作者: huiwq1990 | 来源:发表于2017-06-25 17:55 被阅读0次

从Class.forName说起

查看com.mysql.jdbc.Driver的注释,当一个Driver类被加载的时候,它需要创建自己的一个实例,并且注册到DriverManager中。
Class.forName("com.mysql.jdbc.Driver")会触发类加载,及静态块的初始化。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

另外,DriverManager有个静态块,通过jdbc.properties 及ServiceLoader注册Driver。

static {
        loadInitialDrivers();
        println("JDBC DriverManager initialized");
}

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;
        }
// 通过ServiceLoader注册
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
            public Void run() {
                ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
                Iterator<Driver> driversIterator = loadedDrivers.iterator();
                try{
                    while(driversIterator.hasNext()) {
                        driversIterator.next();
                    }
                } catch(Throwable t) {
                }
                return null;
            }
        });

查看mysql-connector-java-5.1.39.jar!/META-INF/services/java.sql.Driver文件内容

com.mysql.jdbc.Driver
com.mysql.fabric.jdbc.FabricMySQLDriver

注:AccessController、ServiceLoader自行Google。

Driver的处理

将MySQL的Driver对象放入到java.sql.DriverManager#registeredDrivers中,它是一个CopyOnWriteArrayList对象。

    public static synchronized void registerDriver(java.sql.Driver driver,
            DriverAction da)
        throws SQLException {
        if(driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }
    }

打印Driver

public class DriverTest {
    public static void main(String[] args) {
        Enumeration<Driver> drivers = DriverManager.getDrivers();
        while (drivers.hasMoreElements()){
            System.out.println(drivers.nextElement().toString());
        }
    }
}

com.mysql.jdbc.Driver@6193b845
com.mysql.fabric.jdbc.FabricMySQLDriver@433c675d
org.h2.Driver@439f5b3d
com.alibaba.druid.proxy.DruidDriver@533ddba
com.alibaba.druid.mock.MockDriver@aec6354

Connection获取

java.sql.DriverManager#getConnection(java.lang.String, java.util.Properties, java.lang.Class<?>)

       for(DriverInfo aDriver : registeredDrivers) {
            // If the caller does not have permission to load the driver then
            // skip it.
            if(isDriverAllowed(aDriver.driver, callerCL)) {
                try {
                    println("    trying " + aDriver.driver.getClass().getName());
                    Connection con = aDriver.driver.connect(url, info);
                    if (con != null) {
                        // Success!
                        println("getConnection returning " + aDriver.driver.getClass().getName());
//成功获取连接,就返回。
                        return (con);
                    }
                } catch (SQLException ex) {
                    if (reason == null) {
                        reason = ex;
                    }
                }
            } else {
                println("    skipping: " + aDriver.getClass().getName());
            }
        }
// 最后没有找到抛出异常
        // if we got here nobody could connect.
        if (reason != null)    {
            println("getConnection failed: " + reason);
            throw reason;
        }

在获取连接的时候,会获取第一个能成功连接的Connection,如果注册多个MySQL Driver,仅仅会使用第一个。

参考

http://dustin.iteye.com/blog/44291
http://www.dengshenyu.com/java/2017/06/24/jdbc-basic.html

相关文章

  • Mybatis_day01

    1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使用jdbc的原始方法...

  • (05)Mybatis入门及实践

    1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使...

  • Spring入门(三)之整合jdbc

    三、spring入门之整合jdbc 通过继承org.springframework.jdbc.core.suppo...

  • JDBC

    JDBC总结: 1.jdbc入门 2.抽取工具类 3.jdbc与java代码联系的基本sql语句操作 4.JDBC...

  • 【Java Web开发系列课程】JDBC数据库开发快速入门

    免费课程链接:【Java Web开发系列课程】JDBC数据库开发快速入门 什么是JDBC JDBC(Java Da...

  • JDBC 接口学习

    说明:文章所有内容皆选自实验楼教程【JDBC 入门教程】,想要学习更多JDBC,可以点击教程进行学习~ JDBC ...

  • 一、JDBC

    今日内容 JDBC基本概念 快速入门 对JDBC中各个接口和类详解 一、JDBC概述 概念:Java DataBa...

  • JDBC入门

    JDBC入门 时间:20180310 1.1 简介使用java程序访问(操作)数据库(发送sql语句),这叫用到了...

  • JDBC入门

    JDBC的全称:JavaDataBaseConnectivity(java数据库链接)。 作用: 在没有JD...

  • JDBC入门

    JDBC: Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语...

网友评论

      本文标题:JDBC入门

      本文链接:https://www.haomeiwen.com/subject/elrrcxtx.html