当前位置: 首页 > news >正文

Java Web综合项目实战 - 西蒙购物网

文章目录

  • 1. 项目概述
  • 2. 项目运行演示
    • 2.1 前台购物操作演示
    • 2.2 后台管理操作演示
  • 3. 项目实现
    • 3.1 创建数据库与表
      • 3.1.1 创建数据库
      • 3.1.2 运行数据库脚本
      • 3.1.3 查看数据表内容
    • 3.2 创建Web项目
      • 3.2.1 创建Jakarta EE项目
      • 3.2.2 添加三个项目依赖
      • 3.2.3 修改工件名
      • 3.2.4 重新部署项目
    • 3.3 创建实体类
      • 3.3.1 创建用户实体类
      • 3.3.2 创建类别实体类
      • 3.3.3 创建商品实体类
      • 3.3.4 创建订单实体类
    • 3.4 创建数据库工具类
    • 3.5 创建数据访问类
      • 3.5.1 用户数据访问类
      • 3.5.2 类别数据访问类
      • 3.5.3 商品数据访问类
      • 3.5.4 订单数据访问类
    • 3.6 创建服务类
      • 3.6.1 用户服务类
      • 3.6.2 类别服务类
      • 3.6.3 商品服务类
      • 3.6.4 订单服务类
    • 3.7 创建后台处理程序
    • 3.8 准备静态资源
    • 3.9 创建视图页面
  • 4. 项目测试
  • 5. 实战小结

1. 项目概述

  • 西蒙购物网是基于 Jakarta EE 的 Java Web 综合实训项目,涵盖前后台完整购物流程。前台支持注册、登录、分类浏览、购物车、下单、支付[未做];后台提供用户、类别、商品、订单的增删改查。项目采用 MVC 分层,实体-DAO-Service-Servlet 依次解耦,JSTL+Bootstrap 实现响应式页面,AJAX 无刷新加载,MySQL 存储数据,DBUtils 一行 CRUD。通过 Maven 管理依赖,Tomcat 热部署,全程图标+缩进+弹窗优化,真正做到“开箱即用、风格统一、秒级交互”。

2. 项目运行演示

2.1 前台购物操作演示

  • 首页
    在这里插入图片描述
  • 登录页面
    在这里插入图片描述
  • 注册页面
    在这里插入图片描述
  • 普通用户登录成功后显示类别页面
    在这里插入图片描述
  • 单击【家用电器】按钮,显示该类商品
    在这里插入图片描述
  • 选择一些商品,查看购物车
    在这里插入图片描述
  • 【生成订单】页面
    在这里插入图片描述
  • 【显示订单】页面
    在这里插入图片描述
  • 单击【立即支付】按钮,弹出“成功支付”提示框
    在这里插入图片描述

2.2 后台管理操作演示

  • 管理员admin登录后台管理
    在这里插入图片描述
  • 查看用户
    在这里插入图片描述
  • 删除用户[涂文艳]
    在这里插入图片描述
  • 单击【确定】按钮
    在这里插入图片描述
  • 查看用户,列表里已没有【涂文艳】记录
    在这里插入图片描述
  • 查看商品
    在这里插入图片描述
  • 删除【英雄微波炉】
    在这里插入图片描述
  • 单击【确定】按钮,提示商品【英雄微波炉】删除成功
    在这里插入图片描述
  • 单击【确定】,查看商品,列表里已没有【英雄微波炉】商品记录
    在这里插入图片描述

3. 项目实现

3.1 创建数据库与表

3.1.1 创建数据库

  • 创建simonshop数据库
    在这里插入图片描述
  • 打开simonshop数据库
    在这里插入图片描述

3.1.2 运行数据库脚本

  • 数据库脚本:simonshop.sql
/*Navicat Premium Data TransferSource Server         : MySQLSource Server Type    : MySQLSource Server Version : 80043Source Host           : localhost:3306Source Schema         : simonshopTarget Server Type    : MySQLTarget Server Version : 80043File Encoding         : 65001Date: 25/09/2025 08:56:49
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for t_category
-- ----------------------------
DROP TABLE IF EXISTS `t_category`;
CREATE TABLE `t_category`  (`id` int(0) NOT NULL AUTO_INCREMENT,`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of t_category
-- ----------------------------
INSERT INTO `t_category` VALUES (1, '家用电器');
INSERT INTO `t_category` VALUES (2, '床上用品');
INSERT INTO `t_category` VALUES (3, '文具用品');
INSERT INTO `t_category` VALUES (4, '休闲食品');-- ----------------------------
-- Table structure for t_order
-- ----------------------------
DROP TABLE IF EXISTS `t_order`;
CREATE TABLE `t_order`  (`id` int(0) NOT NULL AUTO_INCREMENT,`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`telephone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`total_price` double(10, 1) NOT NULL,`delivery_address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`order_time` timestamp(0) NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of t_order
-- ----------------------------
INSERT INTO `t_order` VALUES (1, '郑晓红', '13956567889', 2000.0, '泸职院大数据学院', '2025-05-25 17:12:36');
INSERT INTO `t_order` VALUES (2, '温志军', '13956678907', 1000.0, '泸职院机械工程学院', '2025-08-26 22:12:17');
INSERT INTO `t_order` VALUES (3, '郑晓红', '13956567889', 1500.0, '泸职院大数据学院', '2025-09-15 16:22:36');-- ----------------------------
-- Table structure for t_product
-- ----------------------------
DROP TABLE IF EXISTS `t_product`;
CREATE TABLE `t_product`  (`id` int(0) NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`price` double(10, 1) NOT NULL,`add_time` timestamp(0) NOT NULL,`image` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`category_id` int(0) NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of t_product
-- ----------------------------
INSERT INTO `t_product` VALUES (1, '容声电冰箱', 2000.0, '2024-12-20 09:54:41', 'images/product1.jpg', 1);
INSERT INTO `t_product` VALUES (2, '松下电视', 5000.0, '2024-12-20 09:54:35', 'images/product2.jpg', 1);
INSERT INTO `t_product` VALUES (3, '红岩墨水', 3.0, '2024-12-20 09:56:05', 'images/product3.jpg', 3);
INSERT INTO `t_product` VALUES (4, '海尔洗衣机', 1000.0, '2024-11-30 08:58:09', 'images/product4.jpg', 1);
INSERT INTO `t_product` VALUES (5, '新宇电饭煲', 1200.0, '2024-12-20 09:55:11', 'images/product5.jpg', 1);
INSERT INTO `t_product` VALUES (6, '英雄微波炉', 600.0, '2024-12-20 09:55:39', 'images/product6.jpg', 1);
INSERT INTO `t_product` VALUES (7, '红双喜席梦思', 700.0, '2024-11-28 08:59:38', 'images/product7.jpg', 2);
INSERT INTO `t_product` VALUES (8, '旺仔牛奶糖', 24.4, '2024-12-20 10:00:11', 'images/product8.jpg', 4);
INSERT INTO `t_product` VALUES (9, '西蒙枕头', 100.0, '2024-12-20 09:56:57', 'images/product9.jpg', 2);
INSERT INTO `t_product` VALUES (10, '甜甜毛毯', 400.0, '2024-12-20 09:57:26', 'images/product10.jpg', 2);
INSERT INTO `t_product` VALUES (11, '永久钢笔', 50.0, '2024-12-20 09:57:30', 'images/product11.jpg', 3);
INSERT INTO `t_product` VALUES (12, '硬面抄笔记本', 5.0, '2024-12-20 09:57:53', 'images/product12.jpg', 3);
INSERT INTO `t_product` VALUES (13, '晨光橡皮擦', 0.5, '2024-11-30 09:02:40', 'images/product13.jpg', 3);
INSERT INTO `t_product` VALUES (14, '美的空调', 3000.0, '2024-11-03 09:03:02', 'images/product14.jpg', 1);
INSERT INTO `t_product` VALUES (15, '迷你深海鱼肠', 14.4, '2024-12-02 10:01:14', 'images/product15.jpg', 4);-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (`id` int(0) NOT NULL AUTO_INCREMENT,`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`password` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`telephone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`register_time` timestamp(0) NOT NULL,`role` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'admin', '12345', '15734345678', '2024-02-02 08:40:35', '管理员');
INSERT INTO `t_user` VALUES (2, '郑晓红', '11111', '13956567889', '2024-04-20 09:51:43', '普通用户');
INSERT INTO `t_user` VALUES (3, '温志军', '22222', '13956678907', '2024-06-20 09:52:36', '普通用户');
INSERT INTO `t_user` VALUES (4, '涂文艳', '33333', '15890905678', '2024-08-05 09:52:56', '普通用户');SET FOREIGN_KEY_CHECKS = 1;
  • 运行数据库脚本:simonshop.sql
    在这里插入图片描述
  • 单击【运行】按钮,显示成功完成字样
    在这里插入图片描述

3.1.3 查看数据表内容

  1. 查看用户表记录
    在这里插入图片描述
  2. 查看类别表
    在这里插入图片描述
  3. 查看商品表
    在这里插入图片描述
  4. 查看订单表
    在这里插入图片描述

3.2 创建Web项目

3.2.1 创建Jakarta EE项目

  • 设置项目基本信息
    在这里插入图片描述
  • 选择Jakarta EE11版本,默认添加Servlet依赖
    在这里插入图片描述
  • 单击【Create】按钮,生成项目基本骨架
    在这里插入图片描述
  • 启动服务器,查看首页
    在这里插入图片描述

3.2.2 添加三个项目依赖

  • MySQL数据库驱动、JSTL标签库及其实现
    在这里插入图片描述

    <!-- MySQL数据库驱动 -->                                          
    <dependency>                                                 <groupId>mysql</groupId>                                 <artifactId>mysql-connector-java</artifactId>            <version>8.0.33</version>                                
    </dependency>                                                
    <!-- JSTL3.0标签库 -->                                          
    <dependency>                                                 <groupId>jakarta.servlet.jsp.jstl</groupId>              <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>    <version>3.0.0</version>                                 
    </dependency>                                                
    <!-- JSTL标签库实现 -->                                           
    <dependency>                                                 <groupId>org.glassfish.web</groupId>                     <artifactId>jakarta.servlet.jsp.jstl</artifactId>        <version>3.0.1</version>                                 <scope>runtime</scope>                                   
    </dependency>
    
  • 刷新项目依赖
    在这里插入图片描述

3.2.3 修改工件名

  • 打开项目结构窗口,切换到工件选项,删短改长,工件名:simonshop
    在这里插入图片描述

3.2.4 重新部署项目

  • 编辑服务器配置,切换到【部署】选项卡,发现部署的工件名与访问路径不一致
    在这里插入图片描述
  • 移除部署的工件,产生一个警告
    在这里插入图片描述
  • 单击【修复】按钮,部署的工件名和访问路径就一致了
    在这里插入图片描述
  • 切换到【服务器】选项卡,URL已经变成http://localhost:8080/simonshop/
    在这里插入图片描述
  • 重启服务器,查看首页
    在这里插入图片描述

3.3 创建实体类

  • 创建实体子包:在net.huawei.simonshop里创建bean子包
    在这里插入图片描述

3.3.1 创建用户实体类

  • bean子包里创建User
    在这里插入图片描述

    package net.huawei.simonshop.bean;import java.util.Date;/*** 功能:用户实体类* 作者:华卫* 日期:2025年10月02日*/
    public class User {private Integer id; // 用户编号private String username; // 用户名private String password; // 密码private String telephone; // 电话private Date registerTime; // 注册时间private String role; // 角色public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public Date getRegisterTime() {return registerTime;}public void setRegisterTime(Date registerTime) {this.registerTime = registerTime;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", telephone='" + telephone + '\'' +", registerTime=" + registerTime +", role='" + role + '\'' +'}';}
    }
    

3.3.2 创建类别实体类

  • bean子包里创建Category
    在这里插入图片描述

    package net.huawei.simonshop.bean;/*** 功能:类别实体类* 作者:华卫* 日期:2025年10月02日*/
    public class Category {private Integer id; // 类别编号private String name; // 类别名称public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Category{" +"id=" + id +", name='" + name + '\'' +'}';}
    }
    

3.3.3 创建商品实体类

  • bean子包里创建Product
    在这里插入图片描述

    package net.huawei.simonshop.bean;import java.util.Date;/*** 功能:商品实体类* 作者:华卫* 日期:2025年10月02日*/
    public class Product {private Integer id; // 商品编号private String name; // 商品名称private Double price; // 商品价格private Date addTime; // 商品上架时间private String image; // 商品图片路径private Integer categoryId; // 商品类别编号public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public Date getAddTime() {return addTime;}public void setAddTime(Date addTime) {this.addTime = addTime;}public String getImage() {return image;}public void setImage(String image) {this.image = image;}public Integer getCategoryId() {return categoryId;}public void setCategoryId(Integer categoryId) {this.categoryId = categoryId;}@Overridepublic String toString() {return "Product{" +"id=" + id +", name='" + name + '\'' +", price=" + price +", addTime=" + addTime +", image='" + image + '\'' +", categoryId=" + categoryId +'}';}
    }
    

3.3.4 创建订单实体类

  • bean子包里创建Order实体类
    在这里插入图片描述

    package net.huawei.simonshop.bean;import java.util.Date;/*** 功能:订单实体类* 作者:华卫* 日期:2025年10月02日*/
    public class Order {private Integer id; // 订单编号private String username; // 用户名private String telephone; // 电话private Double totalPrice; // 总金额private String deliveryAddress; // 发货地址private Date orderTime; // 下单时间public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public Double getTotalPrice() {return totalPrice;}public void setTotalPrice(Double totalPrice) {this.totalPrice = totalPrice;}public String getDeliveryAddress() {return deliveryAddress;}public void setDeliveryAddress(String deliveryAddress) {this.deliveryAddress = deliveryAddress;}public Date getOrderTime() {return orderTime;}public void setOrderTime(Date orderTime) {this.orderTime = orderTime;}@Overridepublic String toString() {return "Order{" +"id=" + id +", username='" + username + '\'' +", telephone='" + telephone + '\'' +", totalPrice=" + totalPrice +", deliveryAddress='" + deliveryAddress + '\'' +", orderTime=" + orderTime +'}';}
    }
    

3.4 创建数据库工具类

  • net.huawei.simonshop里创建utils子包
    在这里插入图片描述
  • utils子包里创建DBUtils
    在这里插入图片描述
package net.huawei.simonshop.utils;import java.sql.*;/*** 功能:数据库工具类* 作者:华卫* 日期:2025年10月02日*/
public class DBUtils {private final String DRIVER = "com.mysql.cj.jdbc.Driver"; // 驱动程序private final String URL = "jdbc:mysql://localhost:3306/simonshop" +"?useSSL=false&useUnicode=true&characterEncoding=utf8"; // 数据库地址private final String USER = "root"; // 数据库用户private final String PASSWORD = "903213"; // 数据库密码private Connection conn; // 数据库连接private PreparedStatement pstmt; // 预备语句对象ResultSet rs; // 结果集/*** 构造方法:初始化数据库连接*/public DBUtils() {try {// 安装数据库驱动Class.forName(DRIVER);// 获取数据库连接conn = DriverManager.getConnection(URL, USER, PASSWORD);} catch (ClassNotFoundException e) {System.err.println("温馨提示:未找到数据库驱动~" + e.getMessage());} catch (SQLException e) {System.err.println("温馨提示:数据库连接不成功~" + e.getMessage());}}/*** 通用查询方法** @param sql    SQL语句字符串* @param params 对象可变参数(给占位符赋值)* @return 结果集*/public ResultSet executeQuery(String sql, Object... params) {try {// 1. 获取预备语句对象pstmt = conn.prepareStatement(sql);// 2. 通过循环遍历对象可变参数for (int i = 0; i < params.length; i++) {// 3. 给占位符赋值(为什么参数索引是`i + 1`呢)pstmt.setObject(i + 1, params[i]);}// 4. 执行查询,返回结果集rs = pstmt.executeQuery();} catch (SQLException e) {System.err.println(e.getMessage());}// 返回结果集return rs;}/*** 通用更新方法** @param sql    SQL语句字符串* @param params 对象可变参数(给占位符赋值)* @return 更新记录数(受影响的行数)*/public int executeUpdate(String sql, Object... params) {// 定义更新记录数int count = 0;try {// 1. 获取预备语句对象pstmt = conn.prepareStatement(sql);// 2. 通过循环遍历对象可变参数for (int i = 0; i < params.length; i++) {// 3. 给占位符赋值(为什么参数索引是`i + 1`呢)pstmt.setObject(i + 1, params[i]);}// 4. 执行更新,返回更新记录数count = pstmt.executeUpdate();} catch (SQLException e) {System.err.println(e.getMessage());}// 返回更新记录数return count;}/*** 释放资源*/public void release() {// 关闭结果集if (rs != null) {try {rs.close();} catch (SQLException e) {System.err.println(e.getMessage());}}// 关闭预备语句对象if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {System.err.println(e.getMessage());}}// 关闭数据库连接if (conn != null) {try {conn.close();} catch (SQLException e) {System.err.println(e.getMessage());}}}
}
  • 代码说明:DBUtils封装MySQL连接、查询、更新与关闭,自动参数注入、异常提示,一行代码完成CRUD,开箱即用。

3.5 创建数据访问类

  • net.huawei.simonshop里创建dao子包
    在这里插入图片描述

3.5.1 用户数据访问类

  1. 创建用户数据访问类

    • dao子包里创建UserDao
      在这里插入图片描述

      package net.huawei.simonshop.dao;import net.huawei.simonshop.bean.User;
      import net.huawei.simonshop.utils.DBUtils;import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.util.ArrayList;
      import java.util.List;/*** 功能:用户数据访问类* 作者:华卫* 日期:2025年10月02日*/
      public class UserDao {/*** 按编号查询用户** @param id 用户编号* @return 用户对象*/public User findById(Integer id) {// 声明用户对象User user = null;// 1. 创建数据库工具对象DBUtils dbUtils = new DBUtils();// 2. 定义SQL字符串String strSQL = "select * from t_user where id = ?";// 3. 执行查询,返回结果集ResultSet rs = dbUtils.executeQuery(strSQL, id);// 4. 判断结果集是否为空try {if (rs.next()) {// 1. 创建用户对象user = new User();// 2. 用当前记录字段值设置用户对象属性user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setTelephone(rs.getString("telephone"));user.setRegisterTime(rs.getTimestamp("register_time"));user.setRole(rs.getString("role"));}} catch (SQLException e) {System.err.println(e.getMessage());} finally {// 5. 释放数据库资源dbUtils.release();}// 返回用户对象return user;}/*** 按用户名查询用户** @param username* @return 用户对象*/public User findByUsername(String username) {// 声明用户对象User user = null;// 1. 创建数据库工具对象DBUtils dbUtils = new DBUtils();// 2. 定义SQL字符串String strSQL = "select * from t_user where username = ?";// 3. 执行查询,返回结果集ResultSet rs = dbUtils.executeQuery(strSQL, username);// 4. 判断结果集是否为空try {if (rs.next()) {// 1. 创建用户对象user = new User();// 2. 用当前记录字段值设置用户对象属性user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setTelephone(rs.getString("telephone"));user.setRegisterTime(rs.getTimestamp("register_time"));user.setRole(rs.getString("role"));}} catch (SQLException e) {System.err.println(e.getMessage());} finally {// 5. 释放数据库资源dbUtils.release();}// 返回用户对象return user;}/*** 查询全部用户** @return 用户列表*/public List<User> findAll() {// 创建用户列表List<User> users = new ArrayList<User>();// 1. 创建数据库工具对象DBUtils dbUtils = new DBUtils();// 2. 定义SQL字符串String strSQL = "select * from t_user";// 3. 执行查询,返回结果集ResultSet rs = dbUtils.executeQuery(strSQL);// 4. 利用条件循环遍历结果集try {while (rs.next()) {// (1) 创建用户对象User user = new User();// (2) 用当前记录字段值设置用户对象属性user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setTelephone(rs.getString("telephone"));user.setRegisterTime(rs.getTimestamp("register_time"));user.setRole(rs.getString("role"));// (3) 将用户对象添加到用户列表users.add(user);}} catch (SQLException e) {System.err.println(e.getMessage());} finally {// 5. 释放数据库资源dbUtils.release();}// 返回用户列表return users;}/*** 插入用户** @param user 用户对象* @return 插入记录数*/public int insert(User user) {// 定义插入记录数int count = 0;// 判断用户名是否存在,用户名不存在就可以插入if (findByUsername(user.getUsername()) == null) {// 1. 创建数据库工具对象DBUtils dbUtils = new DBUtils();// 2. 定义SQL字符串String strSQL = "insert into t_user (username, password, " +"telephone, register_time, role) values (?,?,?,?,?)";// 3. 执行更新,返回插入记录数count = dbUtils.executeUpdate(strSQL, user.getUsername(),user.getPassword(), user.getTelephone(), user.getRegisterTime(), user.getRole());// 4. 释放数据库资源dbUtils.release();} else {System.out.println("温馨提示:[" + user.getUsername() + "]已存在~");}// 返回插入记录数return count;}/*** 更新用户** @param user 用户对象* @return 更新记录数*/public int update(User user) {// 定义更新记录数int count = 0;// 1. 创建数据库工具对象DBUtils dbUtils = new DBUtils();// 2. 创建SQL字符串String strSQL = "update t_user set username = ?, " +"password = ?, telephone = ? where id = ?";// 3. 执行更新,返回更新记录数count = dbUtils.executeUpdate(strSQL, user.getUsername(),user.getPassword(), user.getTelephone(), user.getId());// 4. 释放数据库资源dbUtils.release();// 返回更新记录数return count;}/*** 按编号删除用户** @param id 用户编号* @return 删除记录数*/public int deleteById(Integer id) {// 定义删除记录数int count = 0;// 1. 创建数据库工具对象DBUtils dbUtils = new DBUtils();// 2. 定义SQL字符串String strSQL = "delete from t_user where id = ?";// 3. 执行更新,返回删除记录数count = dbUtils.executeUpdate(strSQL, id);// 4. 释放数据库资源dbUtils.release();// 返回删除记录数return count;}
      }
      
  2. 测试用户数据访问类

    • 创建包

      • test/java里创建net.huawei.simonshop.dao
        在这里插入图片描述
    • 创建测试类

      • net.huawei.simonshop.dao包里创建TestUserDao
        在这里插入图片描述

        package net.huawei.simonshop.dao;import net.huawei.simonshop.bean.User;
        import org.junit.jupiter.api.Test;import java.util.Date;
        import java.util.List;/*** 功能:测试用户数据访问类* 作者:华卫* 日期:2025年10月02日*/
        public class TestUserDao {// 创建用户数据访问对象private UserDao userDao = new UserDao();@Test // 测试按编号查询用户public void testFindById() {// 定义编号Integer id = 5;// 按编号查询用户User user = userDao.findById(id);// 判断查询是否成功if (user != null) {System.out.println(user);} else {System.out.println("编号为[" + id + "]的用户不存在~");}}@Test // 测试用户登录功能public void testLogin() {// 定义用户名和密码String username = "郑晓红";String password = "11111";// 按用户名查询用户User user = userDao.findByUsername(username);// 判断用户是否登录成功if (user != null && user.getPassword().equals(password)) {System.out.println("恭喜,[" + username + "]登录成功~");} else {System.out.println("遗憾,[" + username + "]登录失败~");}}@Test // 测试查询全部用户public void testFindAll() {// 查询全部用户List<User> users = userDao.findAll();// 利用遍历算子输出用户列表users.forEach(System.out::println);}@Test // 测试插入用户public void testInsert() {// 创建用户对象User user = new User();user.setUsername("陈燕文");user.setPassword("44444");user.setTelephone("15834345678");user.setRegisterTime(new Date());user.setRole("普通用户");// 插入用户记录int count = userDao.insert(user);// 判断插入用户是否成功if (count > 0) {System.out.println("恭喜,用户插入成功~");User newUser = userDao.findByUsername(user.getUsername());System.out.println("新增用户:" + newUser);} else {System.out.println("遗憾,用户插入失败~");}}@Test // 测试更新用户public void testUpdate() {// 获取编号为5的用户记录User user = userDao.findById(5);// 输出更新前用户信息System.out.println("更新前:" + user);// 修改用户对象user.setUsername("萌萌哒");user.setPassword("88888");user.setTelephone("13990901122");// 注意:注册时间和角色不能修改// 调用修改用户方法int count = userDao.update(user);// 判断修改用户是否成功if (count > 0) {System.out.println("恭喜,更新用户成功~");// 输出更新后用户信息System.out.println("更新后:" + user);} else {System.out.println("遗憾,更新用户失败~");}}@Test // 测试按编号删除用户public void testDeleteById() {// 定义编号Integer id = 5;// 输出待删记录System.out.println("待删记录:" + userDao.findById(id));// 按编号删除记录int count = userDao.deleteById(id);// 判断删除是否成功if (count > 0) {System.out.println("恭喜,编号为[" + id + "]的用户删除成功~");} else {System.out.println("遗憾,编号为[" + id + "]的用户删除失败~");}}
        }
        
    • 测试按编号查询用户方法

      • 运行testFindById()方法,查看结果
        在这里插入图片描述
      • 修改用户编号,再运行测试方法,查看结果
        在这里插入图片描述
    • 测试用户登录功能

      • 运行testLogin()方法,查看结果
        在这里插入图片描述
      • 修改密码,再运行测试方法,查看结果
        在这里插入图片描述
    • 测试查询全部用户方法

      • 运行testFindAll()方法,查看结果
        在这里插入图片描述
    • 测试插入用户方法

      • 运行testInsert()方法,查看结果
        在这里插入图片描述

      • 在Navicat里查看用户表,看是否插入了新记录
        在这里插入图片描述

      • 不做任何修改,再次运行testInsert()方法,查看结果
        在这里插入图片描述

    • 测试更新用户方法

      • 运行testUpdate()方法,查看结果
        在这里插入图片描述
      • 大家可以看到,只更新了用户名、密码和电话三个字段,其余两个字段没有更新
      • 在Navicat里查看用户表,看是否更新成功
        在这里插入图片描述
    • 测试按编号删除用户方法

      • 运行testDeleteById()方法,查看结果
        在这里插入图片描述
      • 在Navicat里查看用户表,看记录是否删除成功
        在这里插入图片描述
      • 不做任何修改,再次运行测试方法,查看结果
        在这里插入图片描述

3.5.2 类别数据访问类

  1. 创建类别数据访问类
  2. 测试类别数据访问类

3.5.3 商品数据访问类

  1. 创建商品数据访问类
  2. 测试商品数据访问类

3.5.4 订单数据访问类

  1. 创建订单数据访问类
  2. 测试订单数据访问类

3.6 创建服务类

  • net.huawei.simonshop里创建service子包
    在这里插入图片描述

3.6.1 用户服务类

3.6.2 类别服务类

3.6.3 商品服务类

3.6.4 订单服务类

3.7 创建后台处理程序

3.8 准备静态资源

3.9 创建视图页面

4. 项目测试

5. 实战小结

http://www.dtcms.com/a/435366.html

相关文章:

  • Photoshop - Photoshop 更改图像大小
  • 整理k8s中Pod、Deployment和Service的spec配置项--图文篇
  • 网站备案以后怎么做网站建设属于销售费用
  • [QT]常用控件一
  • 探究Function Calling 和 MCP 的奥秘
  • 网站如何做前后端分离网络营销课程学什么
  • 自己手机怎么免费做网站安徽四建东方建设有限公司网站
  • 域名后缀cn做网站家装设计师需要考证吗
  • 广州网站vi设计报价网站建设 图片问题
  • 数据安全能力成熟度模型 (DSMM) 核心要点
  • 飞算JavaAI 使用指南
  • 打鱼跟电子游戏网站怎么做深圳网站制作公司兴田德润信任高
  • 企业级桌面软件如何通过UI/UE设计提升生产效率?
  • 企业级网站内容管理系统学用mvc4做网站
  • 4-7〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸文件上传漏洞-B
  • 大模型PEFT参数高效微调-详解
  • 设置网站关键词怎么做济南网站优化网站
  • 网站建设属于IT吗备案网站ip
  • 网站营销成功的案例温州 建网站
  • 使用python的围棋落子策略
  • 做网站的职位叫什么wordpress页面无法更新
  • Eclipse 创建 Java 包
  • K8s学习笔记(十) Deployment 副本控制器
  • daily notes[68]
  • SPI Flash基础知识点 (chatgpt版本)
  • 昆明城乡和住房建设局网站做网站公司的收费多少
  • LLM 笔记 —— 02 大语言模型能力评定
  • 做网站视频用哪个视频编辑软件网站设计相似侵权吗
  • [特殊字符]灵感补给站 | pinterest 设计灵感分享 UI版面设计3
  • 网站主机一般选哪种的远程访问群晖wordpress