从 HTTP 原理到 JDBC 实战
在 Web 开发领域,HTTP是客户端与服务器通信的 “语言”,负责前后端数据传输;JDBC是 Java 程序与数据库交互的 “桥梁”,支撑数据的持久化存储与操作。二者分别解决网络通信与数据持久化两大核心问题,是 Java Web 开发的基石。本文将从HTTP 核心原理、请求响应流程、常见方法与状态码,到JDBC 核心概念、连接流程、Statement 与 PreparedStatement 区别
一、前言
在 Web 开发领域,HTTP是客户端与服务器通信的 “语言”,负责前后端数据传输;JDBC是 Java 程序与数据库交互的 “桥梁”,支撑数据的持久化存储与操作。二者分别解决网络通信与数据持久化两大核心问题,是 Java Web 开发的基石。
本文将从HTTP 核心原理、请求响应流程、常见方法与状态码,到JDBC 核心概念、连接流程、Statement 与 PreparedStatement 区别、SQL 注入防护,层层递进讲解,结合真实可运行的学生查询实战代码,打通 “浏览器→服务器→数据库” 的完整链路,帮助开发者构建扎实的 Web 开发底层认知。

二、HTTP 原理:Web 通信的基石
2.1 HTTP 概述
HTTP(Hypertext Transfer Protocol,超文本传输协议) 是应用层协议,基于TCP/IP协议栈,默认端口 80(HTTPS 为 443),采用请求 - 响应模型,是浏览器、APP 等客户端与 Web 服务器交互的标准协议。
核心特点:
- 无连接:一次请求对应一次响应,响应后断开连接(HTTP/1.1 支持长连接 Keep-Alive);
- 无状态:协议本身不记录客户端状态,需通过 Cookie、Session、Token 维持会话;
- 简单灵活:请求响应格式简洁,支持文本、图片、JSON 等多种数据格式。
2.2 HTTP 请求结构
客户端向服务器发送的请求,由请求行、请求头、空行、请求体4 部分组成:
http
// 1. 请求行:方法 + URL + 协议版本
GET /index.html HTTP/1.1
// 2. 请求头:键值对,传递客户端信息
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
// 3. 空行:分隔请求头与请求体
// 4. 请求体:仅POST/PUT方法有
常用请求方法
- GET:查询数据,参数拼接在 URL 后;
- POST:提交数据(注册 / 登录),参数在请求体;
- PUT:更新数据;
- DELETE:删除数据。
2.3 HTTP 响应结构
服务器处理请求后返回的响应,由响应行、响应头、空行、响应体4 部分组成:
http
// 1. 响应行
HTTP/1.1 200 OK
// 2. 响应头
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=UTF-8
// 3. 空行
// 4. 响应体
{
"code": 200,
"data": [{"name":"张三","sex":"男","age":20}]
}
常见状态码
- 200 OK:请求成功;
- 400 Bad Request:请求参数错误;
- 404 Not Found:资源不存在;
- 500 Internal Server Error:服务器内部错误。
2.4 HTTP 完整通信流程
- 建立 TCP 连接;
- 发送 HTTP 请求;
- 服务器处理请求;
- 返回 HTTP 响应;
- 断开 TCP 连接;
- 客户端渲染数据。
三、JDBC 原理:Java 连接数据库的桥梁
3.1 JDBC 概述
JDBC(Java Database Connectivity) 是 Java 官方提供的数据库统一访问 API,用于 Java 程序与 MySQL、Oracle 等数据库交互,实现增删改查操作。
3.2 JDBC 核心组件
- Driver:数据库驱动,负责连接;
- DriverManager:加载驱动、获取连接;
- Connection:数据库连接对象;
- Statement/PreparedStatement:执行 SQL 语句;
- ResultSet:封装查询结果集。
3.3 JDBC 标准五步流程
- 注册驱动
- 获取连接
- 创建执行对象
- 执行 SQL、处理结果
- 关闭资源
四、JDBC 实战:学生信息查询(真实可运行代码)
下面以查询 student 表所有学生信息为例,演示最标准、最简洁的 JDBC 查询代码,与你提供的代码完全一致:
4.1 学生查询完整代码
java
运行
package com.qcby.student;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
public class SearchStudent {
public static void main(String[] args) throws Exception {
//1.加载并注册驱动
String className = "com.mysql.cj.jdbc.Driver";
Class.forName(className);
//2.获取数据库连接
String url = "jdbc:mysql://localhost:3306/school?serverTimezone=Asia/Shanghai&useUnicode";
String user = "root";
String password = "2020"; //密码
Connection connection = DriverManager.getConnection(url, user, password);
//3.创建Statement对象
Statement statement = connection.createStatement();
String sql = "select * from student";
//4.执行查询,遍历结果集
ResultSet set = statement.executeQuery(sql);
while (set.next()){
System.out.println(set.getString("name"));
System.out.println(set.getString("sex"));
System.out.println(set.getString("age"));
System.out.println(set.getString("phone"));
System.out.println(set.getString("email"));
System.out.println("------------------------");
}
//5.关闭资源
set.close();
statement.close();
connection.close();
}
}
4.2 代码逐行解析
-
注册驱动
Class.forName("com.mysql.cj.jdbc.Driver")加载 MySQL 官方驱动,使 JDBC 能识别数据库连接。 -
获取连接
url定位数据库地址;user/password验证身份,建立 Java 与数据库的通道。 -
创建 Statement用于发送 SQL 语句到数据库执行。
-
执行查询
executeQuery(sql)执行查询 SQL,返回ResultSet结果集;while(set.next())逐行读取数据,通过字段名获取对应值。 -
关闭资源按结果集→执行对象→连接的顺序关闭,避免资源泄漏。
4.3 运行效果
控制台会输出 student 表中所有学生的:姓名、性别、年龄、电话、邮箱,每条数据分隔显示。
五、JDBC 安全进阶:Statement 与 PreparedStatement
5.1 Statement(基础执行对象,存在风险)
上面学生查询使用的是 Statement,适合静态无参 SQL(如查询全部学生)。
缺点:
- 直接拼接 SQL,存在 SQL 注入漏洞;
- 每次执行都需要编译,性能较低。
5.2 PreparedStatement(预编译对象,企业标准)
优点:
- 使用
?占位符,彻底防 SQL 注入; - SQL 预编译,性能更高;
- 代码更规范、更安全。
5.3 高危漏洞:SQL 注入复现
在登录、条件查询中,若使用 Statement 拼接用户输入,会导致漏洞:
java
运行
// 危险代码:拼接SQL
String name = "张三' or '1'='1";
String sql = "select * from student where name = '"+name+"'";
拼接后 SQL 条件恒成立,可查询所有数据。
5.4 安全修复:PreparedStatement
java
运行
String sql = "select * from student where name = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, name);
ResultSet rs = pstmt.executeQuery();
用户输入仅作为参数,不会改变 SQL 结构,注入完全失效。
六、HTTP + JDBC:Web 全流程打通
6.1 Web 标准执行流程
- 浏览器发送 HTTP GET 请求:
/student/list - 服务器(Tomcat)接收请求
- 执行 JDBC 查询 学生数据
- 将结果封装为 JSON
- 通过 HTTP 响应 返回给前端
6.2 核心价值
- HTTP 负责 “传输数据”
- JDBC 负责 “存取数据”
- 二者结合,实现完整 Web 应用开发
七、JDBC 开发规范与最佳实践
- 必须关闭资源:ResultSet → Statement → Connection
- 禁止使用 Statement 拼接动态 SQL
- 统一使用 PreparedStatement,防注入、提性能
- 使用连接池(Druid/HikariCP)复用连接,提升效率
- 密码不要明文编写,可配置化管理
八、总结
- HTTP 是 Web 通信的基础,请求 - 响应模型支撑前后端交互;
- JDBC 是 Java 操作数据库的标准 API,五步流程固定通用;
- 本文提供的 SearchStudent 代码是最经典 JDBC 入门案例,可直接运行;
- PreparedStatement 是安全开发的底线,能从根源避免 SQL 注入;
- 夯实 HTTP 与 JDBC 底层原理,才能写出安全、高效、稳定的 Java Web 项目。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)