Java Web :JDBC CRUD 与前后端交互
在 Java Web 开发的学习路径中,数据库 CRUD 操作是数据处理的核心基础,前后端 Ajax 交互是实现动态 Web 应用的关键技能。本文将结合实战教学大纲,从零到一拆解 JDBC 增删改查、数据库工具类封装、Servlet 后端处理、前端 Ajax 请求与数据渲染的全流程,手把手带你完成一套可落地的 Web 实战项目,即使是编程新手也能轻松掌握。
前言
本教程专为基础薄弱的学习者设计,全程采用套路化代码 + 实战演练模式,弱化复杂理论,强化动手实践。核心覆盖三大模块:JDBC 基础 CRUD 操作、数据库工具类封装优化、jQuery+Ajax+Servlet 前后端数据交互,最终实现前端页面动态展示数据库数据的完整功能。
第一部分 JDBC 核心实战:数据库增删改查 (CRUD)
JDBC(Java 数据库连接)是 Java 程序操作 MySQL 等关系型数据库的标准接口,是后端开发必备技能。针对学习痛点,我们先夯实最核心的增删改查基础操作,掌握固定代码套路。
一、JDBC 增删改(Delete/Insert/Update)实战
JDBC 的新增、修改、删除操作逻辑高度统一,仅需修改 SQL 语句,代码框架完全复用,这是新手快速上手的核心技巧。
1. 基础前提:数据库准备
我们以student(学生表)为例,表结构包含:id(自增主键)、name(姓名)、sex(性别)、age(年龄)、student_id(学号)、class_id(班级号)。
2. 删除(Delete)操作实现
删除是最基础的单条件操作,通过主键 ID 精准删除数据:
public class StudentDelete { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; // 1. 定义SQL语句,?为占位符,防止SQL注入 String sql = "delete from student where id = ?"; try { // 2. 加载数据库驱动(MySQL 8.0+ 可省略) Class.forName("com.mysql.cj.jdbc.Driver"); // 3. 获取数据库连接(必填:地址、账号、密码,必须配置时区和编码) conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/sql1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8", "root", "你的数据库密码" ); // 4. 创建预编译对象 pstmt = conn.prepareStatement(sql); // 5. 为占位符赋值(第一个?对应id) pstmt.setInt(1, 1); // 6. 执行更新操作,返回受影响行数 int rows = pstmt.executeUpdate(); System.out.println("删除成功,影响行数:" + rows); } catch (Exception e) { e.printStackTrace(); } finally { // 7. 关闭资源(顺序:Statement -> Connection) try { if(pstmt != null) pstmt.close(); if(conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }核心要点:
- 删除 SQL 使用
where条件限定,避免全表删除; executeUpdate()专用于增删改操作,返回受影响的行数;- MySQL 8.0 必须配置
serverTimezone=Asia/Shanghai,否则连接失败。
3. 新增(Insert)与修改(Update)操作
这两个操作仅修改 SQL 和占位符赋值逻辑,代码框架完全复用:
// 新增数据SQL String insertSql = "insert into student(name,sex,age,student_id,class_id) values(?,?,?,?,?)"; // 修改数据SQL String updateSql = "update student set name = ? where id = ?";关键规则:
- 新增操作不插入自增 ID 字段,由数据库自动生成;
- 修改操作必须加
where条件,否则会更新全表数据; - 增删改操作后必须手动关闭资源,防止内存泄漏。
二、JDBC 查询操作与结果集处理
查询操作是开发中最常用的功能,用于从数据库读取数据,核心是结果集 (ResultSet) 遍历。
1. 标准查询流程
public class StudentSelect { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; String sql = "select * from student"; try { // 1. 加载驱动+获取连接(同增删改) Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sql1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8","root","123456"); pstmt = conn.prepareStatement(sql); // 2. 执行查询,返回结果集 rs = pstmt.executeQuery(); // 3. 遍历结果集(rs.next():判断是否有下一条数据) while (rs.next()) { // 根据字段名获取数据 int id = rs.getInt("id"); String name = rs.getString("name"); String sex = rs.getString("sex"); int age = rs.getInt("age"); System.out.println("ID:"+id+",姓名:"+name+",性别:"+sex+",年龄:"+age); } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭资源:ResultSet -> Statement -> Connection try { if(rs != null) rs.close(); if(pstmt != null) pstmt.close(); if(conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }核心要点:
- 查询使用
executeQuery(),返回ResultSet结果集对象; - 资源关闭顺序严格遵循:结果集 → 预编译对象 → 连接对象;
- 通过
rs.get类型("字段名")获取对应数据,类型与数据库保持一致。
第二部分 进阶优化:数据库工具类封装
重复编写连接、关闭资源代码会降低开发效率,因此我们封装通用数据库工具类,实现代码复用,简化开发流程。
一、工具类核心设计
我们封装两个核心工具类:
- DBConnection:统一管理数据库连接配置(地址、账号、密码、驱动);
- MySQLUtil:封装增删改查通用方法,无需重复编写连接和关闭逻辑。
DBConnection 配置类
public class DBConnection { // 仅需修改:数据库名、密码,其余配置固定 private static final String URL = "jdbc:mysql://localhost:3306/sql1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8"; private static final String USER = "root"; private static final String PASSWORD = "你的数据库密码"; private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; // 获取连接 public static Connection getConn() { try { Class.forName(DRIVER); return DriverManager.getConnection(URL, USER, PASSWORD); } catch (Exception e) { e.printStackTrace(); return null; } } // 关闭资源 public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }二、Servlet 中使用工具类实现数据查询
在 Web 项目中,后端通过 Servlet 接收前端请求,调用工具类查询数据,并返回 JSON 格式数据:
@WebServlet("/studentList") public class StudentServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 设置响应编码,防止中文乱码 response.setContentType("application/json;charset=utf-8"); response.setCharacterEncoding("utf-8"); // 2. 定义SQL和查询字段 String sql = "select * from student"; String[] fields = {"id","name","sex","age","student_id","class_id"}; // 3. 调用工具类查询数据,返回集合 List<Map<String, Object>> dataList = MySQLUtil.showUtil(sql, fields); // 4. 封装统一响应格式(code=200表示成功) Map<String, Object> result = new HashMap<>(); result.put("code", 200); result.put("data", dataList); // 5. 返回JSON数据给前端 PrintWriter writer = response.getWriter(); writer.append(JSON.toJSONString(result)); writer.flush(); writer.close(); } }核心优势:
- 无需手动管理连接和资源,工具类自动处理;
- 统一响应格式,前端更容易解析数据;
- 仅需修改 SQL 和字段,即可实现任意表查询。
第三部分 前后端交互实战:Ajax+Servlet + 数据渲染
这是 Web 开发的核心环节:前端发送异步请求 → 后端处理数据 → 前端渲染页面,全程无刷新,提升用户体验。
一、前端核心技术:jQuery + Ajax
我们使用 jQuery 封装的$.ajax()方法发送 GET 请求,获取后端 Servlet 返回的数据。
1. 前端页面基础结构
<!DOCTYPE html> <html lang="utf-8"> <head> <meta charset="UTF-8"> <title>学生信息列表</title> <!-- 引入jQuery --> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <style> table{border-collapse: collapse;width: 800px;margin: 20px auto;} th,td{border:1px solid #333;padding: 8px;text-align: center;} </style> </head> <body> <table id="studentTable"> <thead> <tr> <th>ID</th><th>姓名</th><th>性别</th><th>年龄</th><th>学号</th><th>班级号</th> </tr> </thead> <tbody></tbody> </table> </body> </html>2. 发送 Ajax 请求获取数据
// 页面加载完成后自动请求数据 window.onload = function() { getStudentList(); } // 封装请求方法 function getStudentList() { $.ajax({ // 请求地址:后端Servlet的访问路径 url: "/studentList", // 请求类型 type: "GET", // 预期服务器返回的数据类型 dataType: "json", // 请求成功回调函数 success: function(res) { // 判断请求是否成功 if(res.code === 200) { // 渲染数据到表格 renderTable(res.data); } }, // 请求失败回调 error: function() { alert("数据请求失败!"); } }); }核心要点:
url必须与后端@WebServlet注解路径一致;- 页面加载完成(
onload)后自动触发请求,实现数据回显; - 区分响应状态码,仅成功时渲染数据。
二、前端动态表格数据渲染
接收后端返回的 JSON 数组,通过 JavaScript 动态拼接 HTML,渲染到表格中:
// 表格渲染函数 function renderTable(data) { // 获取表格tbody let tbody = $("#studentTable tbody"); // 清空原有数据 tbody.empty(); // 遍历后端返回的数组 for(let i = 0; i < data.length; i++) { // 获取单条学生数据 let student = data[i]; // 拼接tr和td let tr = $("<tr></tr>"); tr.append("<td>"+student.id+"</td>"); tr.append("<td>"+student.name+"</td>"); tr.append("<td>"+student.sex+"</td>"); tr.append("<td>"+student.age+"</td>"); tr.append("<td>"+student.student_id+"</td>"); tr.append("<td>"+student.class_id+"</td>"); // 将行添加到tbody tbody.append(tr); } }核心逻辑:
- 清空表格原有内容,避免数据重复渲染;
- 遍历 JSON 数组,逐行生成表格行;
- 通过
append()方法将动态生成的 HTML 插入页面; - 字段名必须与后端返回的字段名完全一致。
第四部分 全流程核心要点总结
一、JDBC 开发固定套路
- 四步核心:加载驱动 → 获取连接 → 执行 SQL → 关闭资源;
- 增删改用
executeUpdate(),查询用executeQuery(); - MySQL 8.0 必配:时区、编码,否则连接失败 / 乱码。
二、前后端交互固定流程
- 前端:jQuery 获取表单数据 → Ajax 发送请求 → 解析 JSON → 渲染页面;
- 后端:Servlet 接收请求 → 调用工具类查询数据 → 返回 JSON 响应;
- 统一规范:参数名一致、编码一致、响应格式一致。
三、新手避坑指南
- 404 错误:检查 Ajax 的 url、Servlet 的注解路径是否正确;
- 中文乱码:前后端、数据库、响应头全部设置 UTF-8 编码;
- 数据库连接失败:检查 IP、端口、数据库名、账号密码、时区配置;
- 数据不渲染:核对前后端字段名、响应状态码、遍历逻辑。
写在最后
本教程覆盖了Java Web 开发最核心的基础实战内容,从数据库底层操作到前端页面渲染,形成了完整的技术闭环。对于初学者来说,无需死记硬背代码,只需掌握套路化开发逻辑:JDBC 固定步骤、工具类复用、前后端交互固定流程,通过反复手写练习,就能快速掌握核心技能。
这套技术栈是 Java Web 开发的入门基石,掌握后可轻松拓展学习 SSM、SpringBoot 等主流框架,是进阶高级开发的必经之路。建议大家动手搭建项目,完整跑通全流程,在实践中真正吃透知识点!
