jdbc规范与驱动的关系:类似接口和接口的实现类,通过驱动程序,java应用程序可与数据库进行通信。JDBC由一组java语言编写
的类和接口组成。
JDBC API : 提供了java应用程序到驱动管理器DriverManage的连接。
JDBC驱动程序API: 这支持驱动管理器DriverManager到数据库厂商提供的驱动程序的连接。
JDBC的核心组件:
一、mysql的com.mysql.jdbc.Driver(数据库厂商提供的驱动程序)这个类实现了java.sql.Driver接口,任何数据库提供商的驱动类都必须实现这个接口。
二、关于为什么要注册驱动?
1. 获取数据库连接:数据库连接的本质就是客户端维持了一个和远程MySQL服务器的一个tcp长连接,并在连接上维护了一些信息。
通过DriverManager.getConnection(url,”root”,”root”)获取数据库连接对象时,由于之前已经在DriverManager中注册了驱动类,所以会找到那个驱动类来连接数据库。
Class.forName(“com.mysql.jdbc.Driver”); //java反射机制
Connection conn = DriverManager.getConnection(“jdbc:mysql://
localhost:3306/mydb”,”root”,”root”);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(“select * from stu”);
while(rs.next()){
system.out.println(rs.getInt(“id) + “:” + rs.getString(“name”));
}
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(sql)来获取SQL执行环境ps,是根据需要编译的SQL语句和connection连接对象来创建一个JDBC4PreparedStatement对象。也就是SQL的执行环境。