21.jdbc 学习笔记:从原理到实践的全流程梳理

目录

[1. 数据库客户端-服务器结构与设计阶段](#1. 数据库客户端-服务器结构与设计阶段)

[2. API(应用程序编程接口)的概念](#2. API(应用程序编程接口)的概念)

[3. 数据库多样性与 JDBC 的诞生](#3. 数据库多样性与 JDBC 的诞生)

驱动程序的"生态"差异:

[4. 驱动程序的获取途径](#4. 驱动程序的获取途径)

​编辑

​编辑

​编辑

[5. 手动下载 vs Maven 导入(以 MySQL 驱动为例)](#5. 手动下载 vs Maven 导入(以 MySQL 驱动为例))

手动下载:

[导入项目(IDEA 示例):](#导入项目(IDEA 示例):)

[6. JDBC 编程步骤(核心流程)](#6. JDBC 编程步骤(核心流程))

[步骤 1:创建数据源(DataSource)](#步骤 1:创建数据源(DataSource))

[步骤 2:建立网络连接(Connection)](#步骤 2:建立网络连接(Connection))

[步骤 3:构造 SQL 语句(PreparedStatement)](#步骤 3:构造 SQL 语句(PreparedStatement))

[步骤 4:执行 SQL(Update 操作)](#步骤 4:执行 SQL(Update 操作))

[7. 异常处理(SQLException)](#7. 异常处理(SQLException))

总结


1. 数据库客户端-服务器结构与设计阶段

数据库交互基于客户端-服务器结构

  • 客户端工具:cmd(命令行)、navicat(图形化工具)、自己编写代码实现(Java 等语言)。

  • 服务器:提供数据库服务。

  • 设计/调试阶段:客户端与服务器通过网络通信完成交互。

2. API(应用程序编程接口)的概念

MySQL 提供了一组 API(类/函数),供其他程序调用。例如:

  • MySQL 原生 API(C 语言风格)。

  • 其他数据库/中间件的 API(操作系统、Redis、MQ 等)。

  • 第三方大佬写好的程序/库。

但我们更希望用 Java​ 开发,因此需要 Java 对数据库 API 的"封装"。

3. 数据库多样性与 JDBC 的诞生

市面上有多种数据库(MySQL、Oracle、SQLServer、SQLite...),不同数据库的 API 差异大,学习成本高。

Java 给出的解决方案:JDBC(Java Database Connectivity)。

  • 由 Java 标准库提供一套++类/方法++,把数据库 C 原生 API 封装成 Java 版本。

  • 对不同数据库厂商的 API 进行++风格统一++。

驱动程序的"生态"差异:

  • 商业公司驱动(Sun/Oracle):考虑实用性、盈利,用户多。

  • 社区驱动(C++):追求"炫酷/NB",但实用内容少(如 SQLite/DB2 非客户端-服务器结构,C++ 很少优先考虑)。

→ 第三方没有"一统天下"的类似 JDBC 的方案,每个数据库厂商有自己的驱动

4. 驱动程序的获取途径

驱动程序需额外下载安装(Java 未内置),有三种途径:

  1. 官网:不太方便。

  2. GitHub:开源仓库。

  3. Maven 仓库(推荐,类似"应用商店"):

    • 服务器在海外,国内访问可能慢,但理论可打开。

    • 示例:搜索 mysql jdbc,找到 MySQL Connector/J (注意:mysql-connector-java已重命名为 com.mysql:mysql-connector-j,最新版需匹配 MySQL 服务器版本)。

5. 手动下载 vs Maven 导入(以 MySQL 驱动为例)

手动下载:

  • 从 Maven 仓库下载 mysql-connector-j-8.0.33.jar(或其他版本)。

  • jar 包本质:类似 zip 压缩包,包含编译后的 .class文件,是 Java 生态发布程序的主流方式。

导入项目(IDEA 示例):

  1. 在项目创建目录(如 lib),将 jar 包复制进去(lib= Library,库的计算机术语)。

  2. 右键 lib目录 → Add as Library(让项目识别到该 jar)。

6. JDBC 编程步骤(核心流程)

步骤 1:创建数据源(DataSource)

数据源决定++数据从哪来、数据库服务器在哪++。注意:不是所有数据库都是"客户端-服务器"结构(如 SQLite/DB2 是本地程序,无需网络)。

  • 导入类:import javax.sql.DataSource;

  • DataSource 是接口:public interface DataSource extends CommonDataSource, Wrapper

示例代码(两种方式):

java 复制代码
// 方式1:向上转型 + 向下转型(演示用)
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java117?characterEncoding=utf8&useSSL=false");

// 方式2:直接实例化(不转型,更简洁)
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java117?characterEncoding=utf8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("2222");

URL 格式:jdbc:mysql://<主机>:<端口>/<数据库名>?<参数>

步骤 2:建立网络连接(Connection)

通过数据源获取连接:

java 复制代码
Connection connection = dataSource.getConnection();

→ 类比"打电话":拨号(建立连接)→ 对方接听(同意连接)→ 通话(操作)。

步骤 3:构造 SQL 语句(PreparedStatement)

客户端把 SQL 发给服务器执行,SQL 需是**"语句对象"**(预处理,减少语法检查开销)。

示例:插入数据

java 复制代码
String sql = "insert into student values(null, '张三')";
PreparedStatement preparedStatement = connection.prepareStatement(sql);

→ 服务器端会解析 SQL(语法检查、优化),再执行。

步骤 4:执行 SQL(Update 操作)

增、删、改、建表等属于 update ​ 操作,用 executeUpdate():这是把SQL语句发送到MySQL服务器上进行

java 复制代码
int n = preparedStatement.executeUpdate();
System.out.println("n = " + n); // 影响行数

7. 异常处理(SQLException)

JDBC 抛出 SQLException,需显式处理

  • 方式 1:throws抛给上层方法处理(如 main方法声明 throws SQLException)。

  • 方式 2:try-catch捕获处理。

→ 类比"开车":throws是"驾照"(允许上路,事故找交警);try-catch是"事故处理"(自己解决)。

总结

JDBC 是 Java 操作数据库的标准方案,核心是封装数据库 API、统一操作风格。流程围绕「数据源 → 连接 → SQL 语句 → 执行」展开,需注意驱动版本匹配、URL 格式、异常处理等细节。

本课代码:

java 复制代码
import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Jdbc {
    public static void main(String[] args) throws SQLException {
//        // 方式1:向上转型 + 向下转型(演示用)
//        DataSource dataSource = new MysqlDataSource();
//        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java117?characterEncoding=utf8&useSSL=false");

        // 方式2:直接实例化(不转型,更简洁)
        MysqlDataSource dataSource = new MysqlDataSource();
        dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java117?characterEncoding=utf8&useSSL=false");
        dataSource.setUser("root");
        dataSource.setPassword("Ss.123888");

        //步骤 2:建立网络连接(Connection)
        Connection connection = dataSource.getConnection();

        //步骤 3:构造 SQL 语句(PreparedStatement)
        String sql = "insert into student values(null, '张三', 15, 3)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //步骤 4:执行 SQL(Update 操作)
        int n = preparedStatement.executeUpdate();
        System.out.println("n = " + n); // 影响行数
    }
}
相关推荐
Mahir0810 小时前
Spring 全家桶常见注解全解:从入门到精通
java·后端·spring·面试·常见注解
楠枬10 小时前
Redis 分布式锁
数据库·redis·分布式
尚雷558010 小时前
Oracle 18C 物理 DataGuard 搭建部署完整文档(适合开发测试)
数据库·oracle·dataguard
执笔论英雄10 小时前
GPU内存架构-DSMEM与L2
java·spring·架构
wb0430720110 小时前
从 Java 1 到 Java 26 的HTTP Client发展历程
java·开发语言·http
金仓数据库10 小时前
性能提升超十倍!金仓时序数据库首入北京轨交TCC
数据库·时序数据库
java1234_小锋11 小时前
Redis 如何实现持久化?RDB 和 AOF 的区别是什么?如何选择合适的持久化方式?
数据库·redis·bootstrap
小则又沐风a11 小时前
进一步了解进程---第四章 进程管理
java·服务器·前端
超梦dasgg11 小时前
并查集(Union-Find)详解 + Java 完整实现
java·数据结构·算法·图搜索