mysql驱动源码解析_mysql驱动源码分析

注: 本系列文章使用JDK1.5 数据库驱动版本 mysql-connector-java-5.1.8b

JAVA连接数据库是其众多功能中的一部分,主要有两种方式连接DataBase: 一种是采用JDBC-ODBC桥,另一种则是称之为纯驱动连接DataBase,第一种方式在大型项目中基本上不再使用,本系列文章主要分析纯驱动源码。

对于初学JAVA者,甚至那些使用JAVA做过几年开发的程序员来讲,对于JDBC的工作原理都不一定能够明白。知其然,不知其所以然。遇到问题就不知所措了。通过针对于MYSQL JDBC源码的分析,对于JAVA是如何连接数据库,其中到底做了些什么工作,一步步解剖开来,更好的理解JDBC。

使用JAVA连接数据库,首先要做的就是在程序中导入sql包,然后装载驱动类、获取连接、获取语句对象、发送SQL命令然后得到结果

请看以下代码片段:

/* 连接mysql 时装载的驱动类以及连接字符串 */

Class.forName(“com.mysql.jdbc.Driver”);//1

DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,”root”,”123”);//2

/* 连接SQLServer2005 时装载的驱动类以及连接字符串 */

Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);

DriverManager.getConnection(“jdbc:sqlserver://localhost:1433;databaseName=pubs”,”sa”, ””);

此段代码有两部分,连接不同数据库时所需要装载的驱动类以及连接字符串,以此获取连接。

Class.forName()装载类,在调用一个类的构造方法,初始化静态成员或者这个类有main方法时,JVM都会装载对应的类。

首先我们就看看com.mysql.jdbc.Driver类做了什么事情,找到MYSQL-JDBC驱动源码,解压之后找到src目录,然后找到com.mysql.jdbc下的Driver.java类

package com.mysql.jdbc;

import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {

static {

try {

java.sql.DriverManager.registerDriver(new Driver()); //1

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

// ~ Constructors

// -----------------------------------------------------------

/**

* Construct a new driver and register it with DriverManager

*

* @throws SQLException

* if a database error occurs.

*/

public Driver() throws SQLException {

// Required for Class.forName().newInstance()

}

}

Driver类继承NonRegisteringDriver 同时实现接口java.sql.Driver

此类会有一个静态块

static {

try {

java.sql.DriverManager.registerDriver(new Driver()); //1

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

Class.forName的作用是要求JVM查找并加载指定的类, 也就是说JVM装载此类并执行静态块代码

此静态块只有一句关键部分,1处

在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC 驱动

的Driver类的代码都必须类似下面这段

java.sql.DriverManager.registerDriver(new Driver());

所以,如果你要自己实现一个数据库的JDBC驱动,那么就得实现java.sql.Driver接口,并且需要在实现类中使用java.sql.DriverManager.registerDriver(new Driver())注册自己,new Driver()就是创建一个Driver对象,所以此类会有一个无参数的构造函数:

public Driver() throws SQLException {

}

下面再看看DriverManager.registerDriver()这个方法,源码如下:

public static synchronized void registerDriver(java.sql.Driver driver)

throws SQLException {

if (!initialized) {

initialize();

}

DriverInfo di = new DriverInfo();

di.driver = driver;

di.driverClass = driver.getClass();

di.driverClassName = di.driverClass.getName();

// Not Required -- drivers.addElement(di);

writeDrivers.addElement(di);

println("registerDriver: " + di);

/* update the read copy of drivers vector */

readDrivers = (java.util.Vector) writeDrivers.clone();

}

此方法是一个静态同步的方法,形式参数是java.sql.Driver接口类型,因为com.mysql.jdbc.Driver这个类实现了java.sql.Driver接口,所以com.mysql.jdbc.Driver实例对象new Driver()是可以作为实参传入到此方法中来的。在DriverManager类中都是使用的Driver接口类型,也就是说驱动的使用不依赖于任何实现。如果需要更换你所连接的数据库,只需要在Class.forName传入的参数换成另一个数据库的驱动类,但要求此类必须实现Driver接口。

连载二中会具体分析DriverManager类到底做了些什么工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值