您的位置:首页 > 数据库 > MySQL

JDBC(MYSQL)初步学习

2015-06-02 15:05 597 查看
 


JAVA JDBC(MySQL)驱动源码分析(一)

2010-03-28 21:35 6636人阅读 评论(0) 收藏 举报

jdbcjavamysqlsqlserver数据库database

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

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

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

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

请看以下代码片段:

   

[java] view
plaincopy

/* 连接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类


[b][java] view
plaincopy[/b]

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

此类会有一个静态块


[b][java] view
plaincopy[/b]

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对象,所以此类会有一个无参数的构造函数:

[java] view
plaincopy

public Driver() throws SQLException {  

 }  

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

[java] view
plaincopy

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类到底做了些什么工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: