Java Web实现简易CRUD操作笔记
Java Web实现简易CRUD操作笔记基于ServletMySQL一、项目概述本次上课练习的代码是一套基于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{// 数据库连接参数硬编码Stringdrivercom.mysql.jdbc.Driver;Stringurljdbc:mysql://localhost:3306/may7?useUnicodetruecharacterEncodingutf-8serverTimezoneUTCuseSSLfalse;Stringuserroot;Stringpassword123456;publicConnectionconn;// 构造方法创建连接publicDBConnection(){try{Class.forName(driver);connDriverManager.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.DriverMySQL 8.x需改用com.mysql.cj.jdbc.Driver连接参数URL、用户名、密码硬编码在代码中后续可优化为配置文件如db.properties构造方法自动创建连接提供close()方法释放连接资源。2.2 MysqlUtil数据库操作封装类作用基于DBConnection封装通用的增、删、改、查方法简化Servlet层的数据库操作同时提供查询结果转JSON的工具方法。核心方法分类方法名作用返回值add(sql)执行INSERT语句int1成功update(sql)执行UPDATE语句int1成功del(sql)执行DELETE语句int1成功getJsonBySql(sql, columns)执行SELECT并转JSONStringJSON串listToJson(list, columns)把查询结果集转标准JSONStringJSON串关键笔记增/删/改方法逻辑一致获取连接→创建PreparedStatement→执行SQL→关闭资源→返回执行结果查询方法会将ResultSet结果集转为ArrayListString[]再通过listToJson拼接成固定格式的JSON包含code、msg、data字段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. 拼接查询SQLStringsqlselect * from student order by id desc;// 2. 指定数据库字段与查询结果列对应String[]columns{id,name,sex,age,sno,class_num};// 3. 调用工具类获取JSON数据StringdataMysqlUtil.getJsonBySql(sql,columns);// 4. 设置响应格式UTF-8编码JSON类型resp.setCharacterEncoding(UTF-8);resp.setContentType(application/json;charsetUTF-8);// 5. 返回JSON数据resp.getWriter().append(data);}}通用规律所有查询ServletShowAnimal/ShowPerson/ShowStudent逻辑一致仅SQL和字段数组不同响应格式固定为application/json编码UTF-8避免中文乱码。3.2 新增操作AddXXXServlet以AddAnimalServlet为例WebServlet(/addAnimal)publicclassAddAnimalServletextendsHttpServlet{OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 1. 获取前端传入的参数Stringcolorreq.getParameter(color);Stringagereq.getParameter(age);Stringtypereq.getParameter(type);// 2. 拼接INSERT SQLStringsqlinsert into animal(color,age,type) values(color,age,type);// 3. 调用工具类执行新增intcountMysqlUtil.add(sql);// 4. 构造响应JSON成功/失败Stringdatacount0?{\code\:200,\msg\:\新增成功\}:{\code\:999,\msg\:\新增失败\};// 5. 返回响应resp.setCharacterEncoding(UTF-8);resp.setContentType(application/json;charsetUTF-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. 获取参数含主键idStringidreq.getParameter(id);Stringnamereq.getParameter(name);// ... 其他参数// 2. 拼接UPDATE SQLStringsqlupdate person set name name,... where id id;// 3. 执行修改intcountMysqlUtil.update(sql);// 4. 构造响应JSONStringdatacount0?{\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. 获取主键idStringidreq.getParameter(id);// 2. 拼接DELETE SQLStringsqldelete from student where idid;// 3. 执行删除intcountMysqlUtil.del(sql);// 4. 构造响应JSONStringdatacount0?{\code\:200,\msg\:\删除成功\}:{\code\:999\msg\:\删除失败\};// 5. 返回响应同新增...}}注意点代码中存在语法错误code\:999\msg\缺少逗号应改为code\:999,\msg\:\删除失败\}删除操作仅需主键id逻辑最简单但需谨慎无软删除直接物理删除。四、代码优化建议重点本次练习代码实现了核心功能但存在生产环境需优化的问题4.1 解决SQL注入问题最高优先级当前SQL通过字符串拼接生成如where idid存在严重的SQL注入风险。改进方案使用PreparedStatement参数化查询示例// 原拼接方式危险Stringsqldelete from student where idid;// 优化后参数化Stringsqldelete from student where id?;PreparedStatementpstmtconn.prepareStatement(sql);pstmt.setString(1,id);// 绑定参数pstmt.executeUpdate();4.2 配置解耦将DBConnection中的数据库连接参数URL、用户名、密码抽离到db.properties配置文件通过类加载器读取# db.properties jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/may7?useUnicodetruecharacterEncodingutf-8serverTimezoneUTCuseSSLfalse jdbc.userroot jdbc.password1234564.3 规范请求方式增/删/改操作应使用POST请求doPost方法查询用GET符合HTTP语义规范OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// 把原doGet中的逻辑移到这里}4.4 优化JSON生成方式手动拼接JSON字符串易出错建议引入FastJSON/Jackson等工具// 引入FastJSON示例importcom.alibaba.fastjson.JSONObject;JSONObjectresultnewJSONObject();result.put(code,200);result.put(msg,新增成功);Stringdataresult.toJSONString();4.5 完善异常处理当前仅e.printStackTrace()打印异常应添加日志记录如SLF4J/Logback并返回友好的错误提示。4.6 参数校验新增/修改时校验参数合法性如年龄是否为数字、字段是否为空避免非法参数导致SQL执行失败。五、总结本次练习代码完整覆盖了Servlet JDBC实现CRUD的核心流程数据库连接封装 → 2. 通用SQL操作封装 → 3. Servlet接收请求/处理业务/返回响应掌握了WebServlet注解、请求参数获取、JSON响应格式、JDBC基础操作等关键知识点代码虽能运行但在安全性SQL注入、可维护性硬编码、规范性请求方式等方面仍需优化。这是Java Web入门的经典练习理解这套代码的逻辑后可进一步学习框架如SSM/Spring Boot但底层的JDBC和Servlet原理仍是基础。