之前在看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底层肯定有很多没有使用对象处理的事情,所以说不要被思维惯性束缚了自己,面向对象也好,面向过程也好,只要能解决问题就是好的程序。