news 2026/5/14 1:20:09

Java Web实现简易CRUD操作笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java Web实现简易CRUD操作笔记

Java Web实现简易CRUD操作笔记(基于Servlet+MySQL)

一、项目概述

本次上课练习的代码是一套基于Java Servlet + MySQL实现的简易CRUD(增删改查)系统,核心围绕animal(动物)、person(人员)、student(学生)三张数据库表,通过Servlet接收前端HTTP请求,调用封装的数据库工具类完成数据操作,并返回JSON格式的响应结果。

整体技术栈:Servlet 3.0+(注解式配置)、JDBC(数据库连接)、MySQL(存储数据)、原生JSON字符串拼接(响应数据)。

二、核心工具类解析

2.1 DBConnection:数据库连接工具类

作用:封装MySQL数据库的连接创建与关闭逻辑,是所有数据库操作的基础。

packagecom.qcby.sql;importjava.sql.Connection;importjava.sql.DriverManager;publicclassDBConnection{// 数据库连接参数(硬编码)Stringdriver="com.mysql.jdbc.Driver";Stringurl="jdbc:mysql://localhost:3306/may7?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false";Stringuser="root";Stringpassword="123456";publicConnectionconn;// 构造方法:创建连接publicDBConnection(){try{Class.forName(driver);conn=DriverManager.getConnection(url,user,password);}catch(Exceptione){e.printStackTrace();}}// 关闭连接publicvoidclose(){try{this.conn.close();}catch(Exceptione){e.printStackTrace();}}}

关键笔记

  • 采用DriverManager方式获取JDBC连接,驱动类为MySQL 5.x的com.mysql.jdbc.Driver(MySQL 8.x需改用com.mysql.cj.jdbc.Driver);
  • 连接参数(URL、用户名、密码)硬编码在代码中,后续可优化为配置文件(如db.properties);
  • 构造方法自动创建连接,提供close()方法释放连接资源。

2.2 MysqlUtil:数据库操作封装类

作用:基于DBConnection封装通用的增、删、改、查方法,简化Servlet层的数据库操作,同时提供查询结果转JSON的工具方法。

核心方法分类
方法名作用返回值
add(sql)执行INSERT语句int(1成功)
update(sql)执行UPDATE语句int(1成功)
del(sql)执行DELETE语句int(1成功)
getJsonBySql(sql, columns)执行SELECT并转JSONString(JSON串)
listToJson(list, columns)把查询结果集转标准JSONString(JSON串)

关键笔记

  • 增/删/改方法逻辑一致:获取连接→创建PreparedStatement→执行SQL→关闭资源→返回执行结果;
  • 查询方法会将ResultSet结果集转为ArrayList<String[]>,再通过listToJson拼接成固定格式的JSON(包含codemsgdata字段);
  • JSON拼接时处理了null值和双引号转义,避免JSON格式错误。

三、Servlet层CRUD实现(按功能分类)

Servlet是前端与数据库之间的中间层,通过@WebServlet注解配置访问路径,重写doGet方法处理GET请求,核心逻辑:接收请求参数→拼接SQL→调用MysqlUtil→返回JSON响应。

3.1 查询操作(ShowXXXServlet)

ShowStudentServlet为例:

@WebServlet("/showStudent1")publicclassShowStudentServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 1. 拼接查询SQLStringsql="select * from student order by id desc";// 2. 指定数据库字段(与查询结果列对应)String[]columns={"id","name","sex","age","sno","class_num"};// 3. 调用工具类获取JSON数据Stringdata=MysqlUtil.getJsonBySql(sql,columns);// 4. 设置响应格式(UTF-8编码+JSON类型)resp.setCharacterEncoding("UTF-8");resp.setContentType("application/json;charset=UTF-8");// 5. 返回JSON数据resp.getWriter().append(data);}}

通用规律

  • 所有查询Servlet(ShowAnimal/ShowPerson/ShowStudent)逻辑一致,仅SQL和字段数组不同;
  • 响应格式固定为application/json,编码UTF-8,避免中文乱码。

3.2 新增操作(AddXXXServlet)

AddAnimalServlet为例:

@WebServlet("/addAnimal")publicclassAddAnimalServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 1. 获取前端传入的参数Stringcolor=req.getParameter("color");Stringage=req.getParameter("age");Stringtype=req.getParameter("type");// 2. 拼接INSERT SQLStringsql="insert into animal(color,age,type) values('"+color+"','"+age+"','"+type+"')";// 3. 调用工具类执行新增intcount=MysqlUtil.add(sql);// 4. 构造响应JSON(成功/失败)Stringdata=count>0?"{\"code\":200,\"msg\":\"新增成功\"}":"{\"code\":999,\"msg\":\"新增失败\"}";// 5. 返回响应resp.setCharacterEncoding("UTF-8");resp.setContentType("application/json;charset=UTF-8");resp.getWriter().append(data);}}

通用规律

  • 通过req.getParameter()获取前端参数;
  • 拼接SQL时注意字符串参数加单引号,数值参数直接拼接;
  • 根据MysqlUtil.add()返回值(1/0)判断新增结果,返回固定格式的JSON。

3.3 修改操作(UpdateXXXServlet)

UpdatePersonServlet为例:

@WebServlet("/updatePerson")publicclassUpdatePersonServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 1. 获取参数(含主键id)Stringid=req.getParameter("id");Stringname=req.getParameter("name");// ... 其他参数// 2. 拼接UPDATE SQLStringsql="update person set name = '"+name+"',... where id = "+id;// 3. 执行修改intcount=MysqlUtil.update(sql);// 4. 构造响应JSONStringdata=count>0?"{\"code\":200,\"msg\":\"更新成功\"}":"{\"code\":999,\"msg\":\"更新失败\"}";// 5. 返回响应(同新增)...}}

通用规律

  • 必须传入主键id,用于定位要修改的记录;
  • SQL拼接格式:update 表名 set 字段=值 where id=主键
  • 响应逻辑与新增一致,仅提示语不同。

3.4 删除操作(DelXXXServlet)

DelStudentServlet为例:

@WebServlet("/delStudent")publicclassDelStudentServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 1. 获取主键idStringid=req.getParameter("id");// 2. 拼接DELETE SQLStringsql="delete from student where id="+id;// 3. 执行删除intcount=MysqlUtil.del(sql);// 4. 构造响应JSONStringdata=count>0?"{\"code\":200,\"msg\":\"删除成功\"}":"{\"code\":999\"msg\":\"删除失败\"}";// 5. 返回响应(同新增)...}}

注意点

  • 代码中存在语法错误:"code\":999\"msg\""缺少逗号,应改为"code\":999,\"msg\":\"删除失败\"}
  • 删除操作仅需主键id,逻辑最简单,但需谨慎(无软删除,直接物理删除)。

四、代码优化建议(重点!)

本次练习代码实现了核心功能,但存在生产环境需优化的问题:

4.1 解决SQL注入问题(最高优先级)

当前SQL通过字符串拼接生成(如where id="+id),存在严重的SQL注入风险。
改进方案:使用PreparedStatement参数化查询,示例:

// 原拼接方式(危险)Stringsql="delete from student where id="+id;// 优化后(参数化)Stringsql="delete from student where id=?";PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setString(1,id);// 绑定参数pstmt.executeUpdate();

4.2 配置解耦

DBConnection中的数据库连接参数(URL、用户名、密码)抽离到db.properties配置文件,通过类加载器读取:

# db.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/may7?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false jdbc.user=root jdbc.password=123456

4.3 规范请求方式

增/删/改操作应使用POST请求(doPost方法),查询用GET,符合HTTP语义规范:

@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 把原doGet中的逻辑移到这里}

4.4 优化JSON生成方式

手动拼接JSON字符串易出错,建议引入FastJSON/Jackson等工具:

// 引入FastJSON示例importcom.alibaba.fastjson.JSONObject;JSONObjectresult=newJSONObject();result.put("code",200);result.put("msg","新增成功");Stringdata=result.toJSONString();

4.5 完善异常处理

当前仅e.printStackTrace()打印异常,应添加日志记录(如SLF4J/Logback),并返回友好的错误提示。

4.6 参数校验

新增/修改时校验参数合法性(如年龄是否为数字、字段是否为空),避免非法参数导致SQL执行失败。

五、总结

本次练习代码完整覆盖了Servlet + JDBC实现CRUD的核心流程:

  1. 数据库连接封装 → 2. 通用SQL操作封装 → 3. Servlet接收请求/处理业务/返回响应;
  2. 掌握了@WebServlet注解、请求参数获取、JSON响应格式、JDBC基础操作等关键知识点;
  3. 代码虽能运行,但在安全性(SQL注入)、可维护性(硬编码)、规范性(请求方式)等方面仍需优化。

这是Java Web入门的经典练习,理解这套代码的逻辑后,可进一步学习框架(如SSM/Spring Boot),但底层的JDBC和Servlet原理仍是基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 1:20:09

原创文档:溶剂热法制备NiCo-LDHs及其电催化析氧性能研究

摘要&#xff1a;氢能作为清洁能源的重要载体&#xff0c;其高效制备技术是实现碳中和目标的关键。电化学水分解制氢技术中&#xff0c;析氧反应&#xff08;OER&#xff09;因其缓慢的四电子转移动力学过程成为限制整体效率的瓶颈。层状双金属氢氧化物&#xff08;LDHs&#x…

作者头像 李华
网站建设 2026/5/14 1:19:07

告别工厂库存孤岛:用SAP特殊采购类型40实现集团物料需求统一采购与调拨

集团供应链协同革命&#xff1a;SAP特殊采购类型40的实战解析与业务价值重塑 当某家电制造集团在年度审计中发现&#xff0c;旗下五家工厂的同型号电机库存总量竟足够支撑八个月生产时&#xff0c;管理层意识到传统的分散采购模式正在吞噬企业利润。这正是许多制造企业面临的典…

作者头像 李华
网站建设 2026/5/14 1:17:06

RISC-V开源指令集架构:从设计哲学到商业落地的芯片设计新范式

1. 开源指令集架构的浪潮&#xff1a;从RISC-V研讨会看芯片设计新范式2015年6月底&#xff0c;加州大学伯克利分校的一场研讨会&#xff0c;意外地成为了半导体行业一个微小但意义深远的注脚。这场以RISC-V——一个源自伯克利的开源指令集架构——为主题的会议&#xff0c;不仅…

作者头像 李华
网站建设 2026/5/14 1:15:06

Koikatu HF Patch终极指南:200+插件整合与游戏体验全面升级

Koikatu HF Patch终极指南&#xff1a;200插件整合与游戏体验全面升级 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch 你是否曾因为语言障碍而无法…

作者头像 李华
网站建设 2026/5/14 1:13:07

向量数据库与近似最近邻搜索:从算法原理到生产实践全解析

1. 向量数据库与近似最近邻搜索&#xff1a;从概念到实战全景解析如果你最近在搞AI应用&#xff0c;特别是RAG、推荐系统或者图像检索&#xff0c;那你肯定绕不开一个词&#xff1a;向量数据库。这玩意儿现在火得不行&#xff0c;但说实话&#xff0c;刚接触的时候&#xff0c;…

作者头像 李华