Java - JDBC 操作流程


前言

JDBC 作为一种规范, 提供接口由供应商(如: MySQL)去实现底层驱动, 开发人员只需实现自己的业务代码.

操作

MySQL 版本

mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 8.0.23-0ubuntu0.20.04.1 |
+-------------------------+
1 row in set (0.00 sec)

Maven 依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

代码实现

InputStream resourceAsStream = Thread.currentThread()
		.getContextClassLoader()
		.getResourceAsStream("jdbc.properties");
Properties p = new Properties();
p.load(resourceAsStream);

// 1. 加载 MySQL 驱动并注册
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接
Connection connection = DriverManager.getConnection(URL, p);

// 3. 创建 Statement
Statement statement = connection.createStatement();
// 4. 执行语句
// /* ping */
ResultSet resultSet = statement.executeQuery("select 1");

// 处理结果
while (resultSet.next()) {
    String database = resultSet.getString("1");
    System.out.println(database);
}

下面讲解驱动大概为我们做了什么

1. 加载 MySQL 驱动并注册

  1. Class::forName 去加载名为 com.mysql.cj.jdbc.Driver 的类
  2. 如果该类是第一次加载则会执行 static 代码块
// static 代码块
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}
DriverDriverManagerregisterDriver:DriverInfo1DriverDriverManager

2. 获取连接

  1. DriverManager 根据 url 和属性循环遍历驱动尝试连接, 如果成功则返回 Connection
DriverManagerDriverInfoNonRegisteringDriverConnectionUrlConnectionImplConnectiongetConnectionensureDriversInitialized1CopyOnWriteArrayList<DriverInfo>2driver3url, info4this.session = new NativeSession(hostInfo, this.propertySet)5conStr.getMainHost()6getInstance(HostInfo hostInfo)7.getConnection(URL, p)8DriverManagerDriverInfoNonRegisteringDriverConnectionUrlConnectionImplConnection

3. 创建 Statement

  1. 若无参数使用默认参数创建 Statement
ConnectionStatementImplStatementcreateStatement()createStatement(int resultSetType, int resultSetConcurrency)1new2setResultSetType(resultSetType)3setResultSetConcurrency(resultSetConcurrency)4return5createStatement()6ConnectionStatementImplStatement

4. 执行语句

  1. 重置取消状态
  2. 关闭所有打开的 Results
  3. 获取 session
  4. 执行语句
  5. 发送语句
  6. 读取结果
  7. 返回 result
StatementNativeSessionResultSetInternalMethodsNativeProtocolResultSetexecuteQuery("select 1")resetCancelledState()1implicitlyCloseAllOpenResults()2this.connection.getSession()3execSQL4execSQLthis.protocol5sendCommand6readAllResults7sendQueryPacket8return this.results9executeQuery("select 1")10StatementNativeSessionResultSetInternalMethodsNativeProtocolResultSet

资源

jdbc4.0 book


版权声明:本文为xianzhan_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。