JDBC规范与MySQL驱动的关系详解

jdbc规范与驱动的关系:类似接口和接口的实现类,通过驱动程序,java应用程序可与数据库进行通信。JDBC由一组java语言编写

的类和接口组成。

 

JDBC规范与MySQL驱动的关系详解_第1张图片

JDBC API : 提供了java应用程序到驱动管理器DriverManage的连接。

JDBC驱动程序API: 这支持驱动管理器DriverManager到数据库厂商提供的驱动程序的连接。

JDBC的核心组件:

  1. DriverManager: 这个类管理数据库驱动程序列表。使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。
  2. Driver: 这个接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象。
  3. Connection: 该界面具有联系数据库的所有方法。连接对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
  4. Statement: 使用从此接口创建的对象将SQL语句提交到数据库。除了存储过程之外,一切派生类还接受参数。
  5. ResultSet: 在使用Statement对象执行sql查询后,这些对象保存从数据库检索的数据,它作为一个迭代器,允许我们移动其数据。
  6. SQLException:此类处理数据库应用程序中发生的任何错误 。

 

 

一、mysql的com.mysql.jdbc.Driver(数据库厂商提供的驱动程序)这个类实现了java.sql.Driver接口,任何数据库提供商的驱动类都必须实现这个接口。

二、关于为什么要注册驱动?

1. 获取数据库连接:数据库连接的本质就是客户端维持了一个和远程MySQL服务器的一个tcp长连接,并在连接上维护了一些信息。

通过DriverManager.getConnection(url,root,root)获取数据库连接对象时,由于之前已经在DriverManager中注册了驱动类,所以会找到那个驱动类来连接数据库。

  1. DriverManager类:管理一组JDBC驱动程序的基本服务,这个类里都是静态方法,主要通过调用getConnection方法获取Connection对象。明确每个驱动程序都要实现Driver接口,并且明确在加载某一Driver类时,它应该创建自己的实例并向DriverManager注册该实例。

 

  1. JDBC连接数据库的步骤:
  1. 先导入数据库驱动jar包
  2. 注册驱动

Class.forName(com.mysql.jdbc.Driver); //java反射机制

  1. 创建一个连接对象

Connection conn = DriverManager.getConnection(jdbc:mysql://

localhost:3306/mydb,root,root);

  1. 创建一个sql语句的发送命令对象

Statement stmt = conn.createStatement();

  1. 执行sql,拿到查询的结果集对象

ResultSet rs = stmt.executeQuery(select * from stu);

  1. 输出结果集的数据

while(rs.next()){

system.out.println(rs.getInt(id) + : + rs.getString(name));

}

  1. 关闭连接、命令对象以及结果集

rs.close();

stmt.close();

conn.close();

 

数据库驱动源码分析:

连接数据库时

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

Class.ForName(“com.mysql.jdbc.Driver”);

//只有注册了数据库驱动到DriverManager上才能通过DriverManager的getConnection方法去连接到此数据库

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

class.forname() 装载指定的类,并执行静态代码块。

com.mysql.jdbc.Driver类的作用:

找到com.mysql.jdbc中Driver类:

package com.mysql.jdbc;  

import java.sql.SQLException;  

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

//用Class.ForName() 加载该类时就会执行该静态代码块,即注册 驱动

    static {  

        try {  

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

        } catch (SQLException E) {  

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

        }  

    }  

    // Constructors  

    //Construct a new driver and register it with DriverManager

    public Driver() throws SQLException {  

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

    }  

}  

 

这个driver类必须向drivermanager注册自己

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

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

//静态同步方法

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

    throws SQLException {  

    if (!initialized) {  

        initialize();  

}    

//创建一个驱动信息实例,用于存储驱动信息

DriverInfo di = new DriverInfo();  

//调用getClass()等方法获得驱动(这是数据库厂商提供的驱动) 的类名包名等信息,然后赋值给di的属性。

    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();  

}  

三、com.mysql.jdbc.Driver.connect 是如何建立连接返回数据库连接对象的?

创建了一个MySQL的数据库连接对象。传入host,port,database等连接信息,在com.mysql.jdbc.Connection的构造方法里有个createNewIO()方法。主要有两个作用:1. 建立和MySQLServer的socket连接,2. 连接成功后,进行登录校验,发送用户名。密码,当前数据库连接默认数据库名。

 

  • 创建preparedStatement,设置参数

创建数据库连接之后,通过preparedStatement(sql)来获取SQL执行环境ps,是根据需要编译的SQL语句和connection连接对象来创建一个JDBC4PreparedStatement对象。也就是SQL的执行环境。

 

 

你可能感兴趣的:(mysql,jdbc,mysql)