MySQL-connector加载过程

之前在看goorm连接数据库的时候看到一段代码

import _ "github.com/go-sql-driver/mysql"

引入mysql驱动后把返回值丢弃掉了。原来一直不明白为什么,丢掉了驱动对象那么我们操作数据库是通过什么来进行的呢?
在Java中也是一样的,如果我们不用框架,手动连接数据库的话,是使用这样的代码

Class.forName("com.mysql.cj.jdbc.Driver")
Connection conn = DriverManager.getConnection("url")

这里也是一样,我们把类加载完以后并没有使用,甚至都没有创建它的对象。而是直接使用DriverManager去获取连接了。我们加载这个类的意义在哪呢?如果不用它的对象的话我们直接用DriverManager去连接不就好了吗?
带着这样的疑问我看mysql-connector-java的源码才明白。原来在com.mysql.cj.jdbc.Driver这个类中有一个静态的代码块

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

我们都知到加载一个类的时候静态代码块会自动执行(这里说法不严谨,ClassLoader.loadClass()就不会执行,这里不讨论这个问题),而静态代码里面执行的逻辑就是往DriverManager里面注册一个Driver,所以我们接下来使用DriverManager获取连接就能获取到了。可以想象,如果我们不执行静态代码,没有注册驱动的话,直接获取连接肯定就获取不到了。

根据对这件事情的思考我也明白了这样一个道理:

我们常说Java是一个面向对象的编程语言,所以我们习惯性的做什么事情都要先找到对象,有了对象才能执行逻辑。可是面向对象也是由面向过程演化来的,Java底层肯定有很多没有使用对象处理的事情,所以说不要被思维惯性束缚了自己,面向对象也好,面向过程也好,只要能解决问题就是好的程序。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 开发中连接数据库的方式有多中,可以直接用jdbc连接,也可以配置服务器的连接池.写法也有多种,可以直接写在jsp页...
    传奇内服号阅读 897评论 0 0
  •  在《Java类加载器:类加载原理解析》提到的类加载器的双亲委派模型并不是一个强制性的约束模型,而是Java设计者...
    SunnyMore阅读 2,664评论 2 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,877评论 18 399
  • 如果有一天我醒来时,发现自己的几年Java开发经验被抹掉,重新回到了一个小白的状态。我想要重新自学Java,然后找...
    feel_58e7阅读 610评论 0 1
  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 5,291评论 2 54