22.深入剖析JDBC架构:从原生API到企业级数据交互核心

目录

[一、JDBC 概述](#一、JDBC 概述)

[二、JDBC 核心步骤(代码示例+图示)](#二、JDBC 核心步骤(代码示例+图示))

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

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

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

[示例 1:插入数据(硬编码 SQL)](#示例 1:插入数据(硬编码 SQL))

[示例 2:插入数据(用户输入 + 占位符)](#示例 2:插入数据(用户输入 + 占位符))

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

[示例 1:执行插入(增)](#示例 1:执行插入(增))

[示例 2:执行查询(查)](#示例 2:执行查询(查))

[步骤 5:关闭资源](#步骤 5:关闭资源)

[三、JDBC 与资源管理](#三、JDBC 与资源管理)

[四、常见错误与解决(Connection refused)](#四、常见错误与解决(Connection refused))

[五、JDBC 后续发展(框架封装)](#五、JDBC 后续发展(框架封装))

[六、附录:示例 SQL(建表、插入、查询)](#六、附录:示例 SQL(建表、插入、查询))

总结


一、JDBC 概述

JDBC(Java Database Connectivity)是 Java 标准库提供的一组类/方法 ,用于操作数据库。MySQL 也提供了对应的驱动包(需引入到项目中)。

  • 依赖管理:可通过 Maven 中央仓库引入驱动;部分大厂会搭建私有仓库。

  • 包结构 :驱动包是 jar压缩包(类似 rar),包含 .class二进制字节码文件;Java 源码(.java)编译后生成 .class文件。

二、JDBC 核心步骤(代码示例+图示)

JDBC 操作数据库的核心流程分为 5 步:数据源(DataSource)→ 建立连接 → 构造 SQL → 执行 SQL → 关闭资源。

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

数据源是连接 MySQL 服务器的入口,需配置数据库地址、用户名、密码等。

java 复制代码
// 1. 创建数据源(MySQL 服务器)
DataSource dataSource = new MysqlDataSource();
// 配置数据库地址(IP、端口、库名、字符编码)
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java117?characterEncoding=utf8");
((MysqlDataSource) dataSource).setUser("root");   // 数据库用户名
((MysqlDataSource) dataSource).setPassword("2222"); // 数据库密码
  • mysql 驱动包提供 MysqlDataSource数据库服务器在哪里对应 URL 中的 IP/端口。

步骤 2:建立连接(Connection)

通过数据源获取与数据库的网络连接。

java 复制代码
// 2. 和数据库服务器通信,建立网络连接
Connection connection = dataSource.getConnection();
  • 这是"申请资源"(不仅是内存,还包含网络通信资源)。

步骤 3:构造 SQL 语句

可使用 StatementPreparedStatement(推荐后者,防 SQL 注入)。

示例 1:插入数据(硬编码 SQL)

java 复制代码
// 3. 构造 SQL 语句(插入)
String sql = "insert into student values(null, '张三')";
PreparedStatement preparedStatement = connection.prepareStatement(sql);

示例 2:插入数据(用户输入 + 占位符)

为避免硬编码,可通过 Scanner接收用户输入,并使用**占位符 ?**​ 代替值:

java 复制代码
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要插入的 id: ");
int id = scanner.nextInt();
System.out.println("请输入要插入的 name: ");
String name = scanner.next();

// 占位符 SQL(? 占位置,后续替换)
String sql = "insert into student values(?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 替换占位符(从 1 开始计数)
preparedStatement.setInt(1, id);
preparedStatement.setString(2, name);

步骤 4:执行 SQL

  • 增、删、改 :使用 executeUpdate(),返回受影响的行数。

  • :使用 executeQuery(),返回 ResultSet(结果集)。

示例 1:执行插入(增)

java 复制代码
// 4. 执行 SQL(增、删、改)
int n = preparedStatement.executeUpdate();
System.out.println("n = " + n); // 输出受影响行数

示例 2:执行查询(查)

java 复制代码
// 3. 构造 SQL(查询)
String sql = "select * from student";
PreparedStatement preparedStatement = connection.prepareStatement(sql);

// 4. 执行 SQL,返回结果集 ResultSet
ResultSet resultSet = preparedStatement.executeQuery();

// 遍历结果集(类似迭代器)
while (resultSet.next()) {
    // 获取列值(列名或索引)
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println(id + " " + name);
}
  • ResultSet是"临时表",next()移动光标(初始在首行前,需先调 next()再取值)。

步骤 5:关闭资源

数据库资源(Connection、PreparedStatement、ResultSet)需手动关闭(顺序:先申请的资源后释放)。

java 复制代码
// 5. 关闭连接等资源
resultSet.close();        // 先关结果集
preparedStatement.close(); // 再关语句
connection.close();       // 最后关连接
  • 顺序错误会导致问题(如先关 Connection 再关 PreparedStatement 会报错)。

三、JDBC 与资源管理

Java 内置垃圾回收机制 (自动回收内存),但数据库连接、网络资源需手动释放(属于"非内存资源")。

四、常见错误与解决(Connection refused)

若执行时遇到 java.net.ConnectException: Connection refused: connect,需检查:

  1. IP 和端口是否写错 (如 127.0.0.1:3306是否正确);

  2. 数据库服务器是否正常运行(MySQL 服务是否启动);

  3. 防火墙/云服务器权限(若跨机器访问,需确认 MySQL 端口开放)。

五、JDBC 后续发展(框架封装)

实际开发中,很少直接写 JDBC 代码,而是使用更高层次的数据库框架 (如 MyBatis、MyBatis Plus、JPA 等)。这些框架底层都是对 JDBC 的封装,目的是简化代码、提高开发效率

  • 核心逻辑不变:SQL → 索引/事务 → JDBC → 框架封装。

六、附录:示例 SQL(建表、插入、查询)

sql 复制代码
use java117;            -- 切换数据库
show tables;           -- 查看表
drop table student;    -- 删除表(谨慎)
create table student (
    id int primary key auto_increment,
    name varchar(20)
);                     -- 建表
select * from student; -- 查询

总结

JDBC 是 Java 操作数据库的基础,核心流程为 数据源→连接→SQL→执行→关闭。实际开发中会用框架简化,但理解 JDBC 原理(尤其是资源管理、SQL 执行逻辑)是必备技能。

相关推荐
严同学正在努力21 分钟前
从备份到恢复:我用 30 分钟恢复了误删的核心业务表
android·java·数据库·ai
#六脉神剑1 小时前
myBuilder新版本(8月,Office文件预览、Oracle数据库支持)
数据库·oracle·开发平台·数字化工具·mybuilder
花青泽1 小时前
5-数据库-SQL注入-联合查询-AND/OR绕过-day13
数据库·sql
QQ_21696290961 小时前
Spring Boot 养老院管理系统:从入住、护理到费用结算的全流程实现(源码可领)
java·spring boot·后端
踏着七彩祥云的小丑1 小时前
忘记Redis是否安装过时查看
数据库·redis·缓存
cxoptics1 小时前
冰洲石分束器设计与应用
java
ck-joker2 小时前
M1 Pro跑LLM实测:Ollama+LangChain4j零成本本地大模型开发,比云端API快在哪?
java·语言模型
乐思智能科技有限公司2 小时前
PLECS软件学习使用(二)直流电机基本系统模型
人工智能·算法·机器学习·面试·职场和发展
丙氨酸長鏈2 小时前
[Bukkit插件开发]手持发射器箭矢机枪 教学文档 面向Python/C#开发者入门Java与Bukkit API
java·python·c#
Nontee2 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式