JDBC(MYSQL)初步学习

来源:互联网 发布:武装党卫军 知乎 编辑:程序博客网 时间:2024/05/17 01:44
 

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

 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
  1. /* 连接mysql 时装载的驱动类以及连接字符串 */  
  2. Class.forName(“com.mysql.jdbc.Driver”);//1  
  3. DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,”root”,”123”);//2  
  4. /* 连接SQLServer2005 时装载的驱动类以及连接字符串 */  
  5. Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);  
  6. 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类

[java] view plaincopy
  1. package com.mysql.jdbc;  
  2. import java.sql.SQLException;  
  3. public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
  4.     static {  
  5.         try {  
  6.             java.sql.DriverManager.registerDriver(new Driver()); //1  
  7.         } catch (SQLException E) {  
  8.             throw new RuntimeException("Can't register driver!");  
  9.         }  
  10.     }  
  11.     // ~ Constructors  
  12.     // -----------------------------------------------------------  
  13.     /** 
  14.      * Construct a new driver and register it with DriverManager 
  15.      *  
  16.      * @throws SQLException 
  17.      *             if a database error occurs. 
  18.      */  
  19.     public Driver() throws SQLException {  
  20.         // Required for Class.forName().newInstance()  
  21.     }  
  22. }  

Driver类继承NonRegisteringDriver 同时实现接口java.sql.Driver
此类会有一个静态块

[java] view plaincopy
  1. static {  
  2.         try {  
  3.             java.sql.DriverManager.registerDriver(new Driver()); //1  
  4.         } catch (SQLException E) {  
  5.             throw new RuntimeException("Can't register driver!");  
  6.         }  
  7.     }  

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
  1. public Driver() throws SQLException {  
  2.  }  

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

[java] view plaincopy
  1. public static synchronized void registerDriver(java.sql.Driver driver)  
  2.     throws SQLException {  
  3.     if (!initialized) {  
  4.         initialize();  
  5.     }  
  6.         
  7.     DriverInfo di = new DriverInfo();  
  8.     di.driver = driver;  
  9.     di.driverClass = driver.getClass();  
  10.     di.driverClassName = di.driverClass.getName();  
  11.     // Not Required -- drivers.addElement(di);  
  12.     writeDrivers.addElement(di);   
  13.     println("registerDriver: " + di);  
  14.       
  15.     /* update the read copy of drivers vector */  
  16.     readDrivers = (java.util.Vector) writeDrivers.clone();  
  17. }  


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

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

0 0
原创粉丝点击