一、前言

在 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 完整通信流程

  1. 建立 TCP 连接
  2. 发送 HTTP 请求
  3. 服务器处理请求
  4. 返回 HTTP 响应
  5. 断开 TCP 连接
  6. 客户端渲染数据

三、JDBC 原理:Java 连接数据库的桥梁

3.1 JDBC 概述

JDBC(Java Database Connectivity) 是 Java 官方提供的数据库统一访问 API,用于 Java 程序与 MySQL、Oracle 等数据库交互,实现增删改查操作。

3.2 JDBC 核心组件

  1. Driver:数据库驱动,负责连接;
  2. DriverManager:加载驱动、获取连接;
  3. Connection:数据库连接对象;
  4. Statement/PreparedStatement:执行 SQL 语句;
  5. ResultSet:封装查询结果集。

3.3 JDBC 标准五步流程

  1. 注册驱动
  2. 获取连接
  3. 创建执行对象
  4. 执行 SQL、处理结果
  5. 关闭资源

四、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 代码逐行解析

  1. 注册驱动Class.forName("com.mysql.cj.jdbc.Driver") 加载 MySQL 官方驱动,使 JDBC 能识别数据库连接。

  2. 获取连接url 定位数据库地址;user/password 验证身份,建立 Java 与数据库的通道。

  3. 创建 Statement用于发送 SQL 语句到数据库执行。

  4. 执行查询executeQuery(sql) 执行查询 SQL,返回ResultSet结果集;while(set.next()) 逐行读取数据,通过字段名获取对应值。

  5. 关闭资源结果集→执行对象→连接的顺序关闭,避免资源泄漏。

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 标准执行流程

  1. 浏览器发送 HTTP GET 请求:/student/list
  2. 服务器(Tomcat)接收请求
  3. 执行 JDBC 查询 学生数据
  4. 将结果封装为 JSON
  5. 通过 HTTP 响应 返回给前端

6.2 核心价值

  • HTTP 负责 “传输数据”
  • JDBC 负责 “存取数据”
  • 二者结合,实现完整 Web 应用开发

七、JDBC 开发规范与最佳实践

  1. 必须关闭资源:ResultSet → Statement → Connection
  2. 禁止使用 Statement 拼接动态 SQL
  3. 统一使用 PreparedStatement,防注入、提性能
  4. 使用连接池(Druid/HikariCP)复用连接,提升效率
  5. 密码不要明文编写,可配置化管理

八、总结

  1. HTTP 是 Web 通信的基础,请求 - 响应模型支撑前后端交互;
  2. JDBC 是 Java 操作数据库的标准 API,五步流程固定通用;
  3. 本文提供的 SearchStudent 代码是最经典 JDBC 入门案例,可直接运行;
  4. PreparedStatement 是安全开发的底线,能从根源避免 SQL 注入;
  5. 夯实 HTTP 与 JDBC 底层原理,才能写出安全、高效、稳定的 Java Web 项目。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐