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 查看数据表内容
- 查看用户表记录
- 查看类别表
- 查看商品表
- 查看订单表
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 用户数据访问类
-
创建用户数据访问类
-
在
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;} }
-
-
测试用户数据访问类
-
创建包
- 在
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 类别数据访问类
- 创建类别数据访问类
- 测试类别数据访问类
3.5.3 商品数据访问类
- 创建商品数据访问类
- 测试商品数据访问类
3.5.4 订单数据访问类
- 创建订单数据访问类
- 测试订单数据访问类
3.6 创建服务类
- 在
net.huawei.simonshop
里创建service
子包