news 2026/9/28 11:35:54

Java花店管理系统源码+数据库:从建表到部署的完整实战解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java花店管理系统源码+数据库:从建表到部署的完整实战解析

简介:一套基于Java开发的花店管理系统项目源码,整体采用JSP+Servlet技术实现,包含登录注册、花店商品展示、用户管理、订单管理、后台管理等功能模块,适合Java Web初学者、课程设计或毕业设计者参考。压缩包共98个文件,大小仅2.56MB,主要包含27个Java源文件、16个JSP页面、9个CSS与6个JS样式交互脚本,另有21张JPG图片、XML配置文件及Eclipse项目描述文件;前端页面位于WebContent下,后端控制代码集中在src/com中,目录结构清晰,便于按模块查阅。通过这套源码,读者可以直观了解典型Java Web项目的页面请求、业务逻辑与数据流转方式,并可从后台订单处理、用户管理等模块中借鉴管理系统的设计思路。目前已有636人学习下载,适合作为快速上手的参考项目。

1. 拿到这份“基于java的花店管理系统源码+数据库.zip”之后,先别急着解压看代码

很多做课程设计或毕设的读者第一次拿到这种压缩包,习惯性先双击进去找 Java 文件,然后被几十个类绕晕。实际上,这种“基于 java 的花店管理系统源码+数据库”的项目,本质是 Java Web 技术栈里一套典型的 CRUD 业务系统:花材分类、商品上架、客户管理、订单处理这几个核心闭环,加上一个 MySQL 数据库脚本。它能帮你解决的,不只是“交一份作业”,而是让你在最短时间内搞懂一个真实管理系统从建表到页面展示的完整链路。

这里的常见落点一般是 JSP + Servlet + MySQL + Tomcat,或者 SSM(Spring + SpringMVC + MyBatis)的变体。适合的人群很明确:正在准备 Java 课程设计、毕业设计,或者想参考一套完整增删改查代码来提速的初学者。与其去搜索引擎里零散地找“java课程设计案例源码”,不如把这份压缩包当成一个可运行的骨架,然后按自己的业务需求去改造它。下面我按实际项目落地的顺序,把解压之后该怎么办讲透。

2. 花店管理系统的业务拆解:从“卖花”到“管订单”要建几张表

2.1 功能模块:一个课程设计级别系统最常见的边界

打开源码包之前,先想清楚这套系统该有哪些页面。常见做法是分为前台展示和后台管理两大部分。前台给普通访客看:花材列表、分类浏览、加入购物车、提交订单;后台给店主用:花材上下架、库存修改、订单状态变更、客户信息维护。

下表是我见过的大多数 Java 课程设计花店项目共同采用的模块划分:

模块核心功能涉及页面
花材管理花材增删改查、按分类筛选、库存数量维护flower_list.jsp、flower_edit.jsp
分类管理花材分类的树形或列表维护category_list.jsp
客户管理注册、登录、收货信息login.jsp、register.jsp
订单管理下单、订单列表、状态流转order_list.jsp、order_detail.jsp
统计模块按花材销量或订单金额汇总stats.jsp(部分项目没有)

判断一套源码是否“够用”,别只看功能多不多,而是看订单这条主链是否首尾通。大部分花店管理系统翻车都翻在同一个地方:商品能加购物车,但订单表里没有存收货地址,或者在订单下单时没扣减库存。拿到源码后,先沿着“用户选花 → 生成订单 → 后台改状态”这条路径把代码读一遍,比逐行看更重要。

2.2 数据库表设计:围绕订单状态流,别把表建多了

花店系统的数据库一般不大,课程设计级别 6 到 8 张表就够。最常见的核心表包括:用户表(含管理员和普通客户)、花材分类表、花材表、订单主表、订单明细表。有的项目会额外加一张进货入库表或购物车表,这个取决于源码作者的设计偏好。

下面这段建表 SQL 参考了课程设计项目里最常见的模型,去掉了与订单无关的冗余字段:

-- 花材分类表 CREATE TABLE flower_category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL COMMENT '分类名称,如玫瑰/百合/绿植', sort_order INT DEFAULT 0 COMMENT '控制前台展示顺序,数字越小越靠前' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 花材表 CREATE TABLE flower ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT NOT NULL COMMENT '关联flower_category.id', name VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL COMMENT '使用DECIMAL而非FLOAT,避免金额精度丢失', stock INT DEFAULT 0 COMMENT '库存,下单时要同步扣减', image_url VARCHAR(255) DEFAULT '', status TINYINT DEFAULT 1 COMMENT '1上架 0下架', create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 订单主表 CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL COMMENT '业务单号,推荐用时间戳+随机数生成', customer_id INT NOT NULL, total_amount DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 0 COMMENT '0待付款 1已付款 2配送中 3已完成 4已取消', receive_name VARCHAR(50) NOT NULL, receive_phone VARCHAR(20) NOT NULL, receive_address VARCHAR(200) NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 订单明细表 CREATE TABLE order_item ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, flower_id INT NOT NULL, flower_name VARCHAR(100) NOT NULL COMMENT '冗余商品名称,防止商品改名后历史订单错乱', price DECIMAL(10,2) NOT NULL, quantity INT NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这里有几个参数值得说明。价格字段必须用DECIMAL(10,2)而不是FLOAT或DOUBLE,花店常有 9.9 元、19.9 元这种定价,浮点数在累加求和时会出精度玄学,对账时让人头疼。订单主表里冗余了receive_name、receive_phone、receive_address,而不是只存一个客户 ID,这是故意设计的——客户可以改自己的默认收货地址,但历史订单必须保留下单那一刻的原样信息。order_item表冗余flower_name同理,商品改名不影响历史订单展示。

2.3 数据关联怎么走:外键、状态字段与查询的取舍

课程设计级别的花店系统,我一般不建议建物理外键。原因很现实:源码包里的 SQL 脚本多数是脱胎于某个同学的作业,如果加了FOREIGN KEY约束,删除花材分类时会被订单明细挡住,实操中会频繁遇到外键冲突的报错。逻辑外键足够,也就是在 Java 代码里通过JOIN或二次查询来维护关联。

状态字段是这个系统的灵魂。花店订单的状态一般用TINYINT存一条数字状态,从 0 到 4,对应待付款、已付款、配送中、已完成、已取消。这里踩过坑的同学不少,最常见的是状态变更的“后悔药”没做:后台点了“已完成”后,订单直接变成终态,想撤销只能改数据库。如果你拿到的源码里没有状态回退功能,建议自己加一个“完成前可回退到配送中”的操作,否则演示时手抖一下就得重来。

查询路径上,最常见的是三类:前台按分类查花材、后台按月查订单、按客户查历史购买记录。前两类在源码里一般都有体现,第三类有时候没有。如果你打算在答辩时突出亮点,第三类查询值得加上,因为它正好是“数据库增删改查”里的查加关联的综合演练。

3. 在本地跑通这套系统:JDK+MySQL+Tomcat 的完整落地步骤

3.1 环境准备:别用太新的版本,JDK 8 和 MySQL 5.7 最稳

拿到源码先看两处:web.xml里配置的 Servlet 版本,以及lib目录下有哪些 jar 包。基于 java 的花店管理系统如果走的是 JSP + Servlet 路线,最稳的环境是 JDK 8 + MySQL 5.7 + Tomcat 8.5/9。如果源码用了 Spring 系列,那么 JDK 8 依然比 JDK 11/17 兼容性更好,因为很多课程设计代码是基于 JDK 8 语法写的,换到新版 JDK 后sun.misc包相关的类会直接编译报错。

安装完 JDK 后,在命令行里验证一下:

java -version # 期望看到 1.8.0_xxx,注意如果是 openjdk 17 之类,后续编译时容易碰壁 mvn -v # 如果源码带 pom.xml,则需要 Maven;纯 JSP+Servlet 项目可以跳过

这条命令能确认两件事:JDK 版本是否符合项目需求,以及是否需要走 Maven 依赖管理。很多同学翻车的点是本机装了 MySQL 8.0 但源码里 JDBC 驱动是 5.x,启动时直接报CommunicationsException。如果你发现驱动和数据库版本不匹配,优先把 MySQL 换回 5.7,而不是去改驱动——老代码里很多 SQL 写法在 MySQL 8.0 的严格模式下会报ONLY_FULL_GROUP_BY之类的错。

3.2 导入数据库:source 命令与编码坑

数据库脚本通常是压缩包里sql或db文件夹下的.sql文件。打开看一眼开头几行,如果是DROP TABLE IF EXISTS说明可以重复导入;如果只有CREATE TABLE,那么导入前先确认库里没有同名表。

导入命令如下:

mysql -uroot -p # 进入MySQL后依次执行: CREATE DATABASE flower_shop DEFAULT CHARACTER SET utf8mb4; USE flower_shop; SET NAMES utf8mb4; SOURCE /your/path/flower_shop.sql;

这里最值得说的是SET NAMES utf8mb4。很多旧版源码的 SQL 脚本里写的是utf8,而花名里有“百合”“蔷薇”这类中文没问题,但如果你加了自己的测试数据,比如 emoji 表情或特殊符号,只有utf8mb4能存得下。另外,用SOURCE导入时如果报Unknown command,多半是文件路径里有空格,把路径用双引号包起来即可。

导入完验证一张表:

USE flower_shop; SELECT COUNT(*) FROM flower;

如果flower_category和flower能查到种子数据,说明脚本执行完整。如果查出 0 行,别慌,看一眼脚本里是否只有建表语句没有INSERT。有些源码为了压缩体积把数据放在另一个.sql文件里,需要单独导入。

3.3 启动项目并验证:从 Tomcat 部署到首页展示

如果是纯 JSP + Servlet 项目,没有pom.xml,那么直接把整个文件夹拷贝到 Tomcat 的webapps目录下,改名为flower_shop,然后启动 Tomcat:

# 切到Tomcat目录下的bin文件夹 ./startup.sh # Mac/Linux # 或者 startup.bat # Windows

启动后浏览器访问http://localhost:8080/flower_shop,能看到首页说明部署成功。如果 404,先看 Tomcat 的logs/catalina.out日志。这里我碰到过最典型的问题是项目内WEB-INF/web.xml里配置的welcome-file指向了/flowerList.do,但 servlet 映射没配对,导致打开首页时直接 404,需要改成直接访问index.jsp加上一个url-pattern匹配。这类问题在日志里会有No mapping found字样,照着日志里的路径去对web.xml就行。

数据库连接配置一般在src/db.properties或WEB-INF/classes/jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/flower_shop?useUnicode=true&characterEncoding=utf8&useSSL=false jdbc.username=root jdbc.password=123456

注意useSSL=false这个参数。MySQL 5.7 + 老版 JDBC 驱动如果没有这个参数,控制台会刷 SSL 警告,虽然不影响运行,但第一次跑通时容易让人误以为系统坏了。密码改成你自己数据库的实际密码后,重启 Tomcat,再用管理员账号登录后台。默认账号密码通常在 SQL 脚本的admin表里,搜一下INSERT INTO语句就能看到,注释里也会写。

4. 源码怎么改才不翻车:从登录到订单状态的核心代码修改路径

4.1 看懂分层:Controller-Service-DAO 的调用链

花店管理系统的源码结构一般逃不出这两种风格。第一种是纯 JSP + Servlet,代码写在servlet包里,每个请求对应一个doGet/doPost方法;第二种是 SSM,分包为controller、service、mapper。无论哪种,你都要先找到“登录”这条链路,因为它是所有功能里最简单、最完整、最不会读乱的一条。

以纯 JSP + Servlet 为例,登录的调用链是:

// LoginServlet.java —— 接收前端参数 @WebServlet("/login") public class LoginServlet extends HttpServlet { private UserService userService = new UserService(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); User user = userService.login(username, password); if (user != null) { req.getSession().setAttribute("loginUser", user); resp.sendRedirect("flowerList"); // 登录成功转去花材列表 } else { req.setAttribute("msg", "用户名或密码错误"); req.getRequestDispatcher("login.jsp").forward(req, resp); } } }

对应的 Service 层:

public User login(String username, String password) { // 课程设计级别一般不做密码加密,只用MD5或明文,但你能顺手改成BCrypt会更有亮点 return userDao.findByUsernameAndPassword(username, password); }

这段代码里值得学习的有三点。第一,req.getSession().setAttribute是登录状态的通行证,后续所有需要登录的页面都会从 Session 里取这个对象;第二,登录失败时的处理是forward而不是sendRedirect,这样能保留msg属性回显到页面上;第三,resp.sendRedirect("flowerList")是重定向,浏览器 URL 会变为/flowerList,符合 PRG(POST-Redirect-GET)模式,刷新页面时不会重复提交表单。

想快速验证自己是否读懂了这套结构,做一个练习:把“管理员登录后跳转首页”改成“管理员登录后跳转到订单列表页”。只需要改sendRedirect的目标,然后去web.xml或注解里找到orderList的映射路径。能改通,说明你对请求转发和 Servlet 映射已经心里有数。

4.2 给订单加一个“配送中”状态:一次完整的改码过程

花店订单的状态字段在数据库里是TINYINT,在页面里是下拉框。很多课程设计项目的下拉框是写死的:

<select name="status"> <option value="0">待付款</option> <option value="1">已付款</option> <option value="2">配送中</option> <option value="3">已完成</option> </select>

如果源码里没有“配送中”这个状态,你想加上去,需要动三处:数据库注释、后端更新逻辑验证、前端展示标签。数据库不用改表结构,只是把注释改一下;后端在订单状态更新的 Servlet 里,检查当前状态和目标状态的跳变是否合法;前端需要把状态数字翻译回中文显示给用户。

状态机校验是这段代码的核心:

// OrderService.java private static final Map<Integer, List<Integer>> ALLOWED_TRANSITIONS = new HashMap<>(); static { // 待付款 -> 已付款/取消;已付款 -> 配送中/取消;配送中 -> 已完成 ALLOWED_TRANSITIONS.put(0, Arrays.asList(1, 4)); ALLOWED_TRANSITIONS.put(1, Arrays.asList(2, 4)); ALLOWED_TRANSITIONS.put(2, Arrays.asList(3)); } public boolean changeStatus(int orderId, int targetStatus) { Order order = orderDao.findById(orderId); if (order == null) { return false; } List<Integer> allowed = ALLOWED_TRANSITIONS.get(order.getStatus()); if (allowed == null || !allowed.contains(targetStatus)) { // 非法跳变,比如从已完成改为配送中,直接拒绝 return false; } return orderDao.updateStatus(orderId, targetStatus); }

这段代码看着简单,却是很多人忽略的“黑匣子”解药。直接执行UPDATE orders SET status=? WHERE id=?谁都会写,但真实业务里订单状态必须单向流转或有限回退。花店配送场景中,最常见的手误是“已完成”状态被改回“待付款”,导致对账时出现负数收入。加上这个合法性校验后,错误操作会被直接拒绝,演示时不会翻车。

前端展示状态时,封装一个 JSP 函数或 Java Map 进行数字到文字的翻译:

// JSP里用EL表达式 + Map Map<Integer, String> statusMap = new HashMap<>(); statusMap.put(0, "待付款"); statusMap.put(1, "已付款"); statusMap.put(2, "配送中"); statusMap.put(3, "已完成"); statusMap.put(4, "已取消");

唯一的注意点是Integer的自动拆箱,在 JSP 里用<c:if test="${order.status == 2}">时偶尔会有类型匹配不到的情况,建议先${order.status}转成字符串再比较。

4.3 分页查询的花店场景改造:搜花名、按分类筛选、价格区间

分页是花店管理系统源码里最常被问到“怎么改”的地方。许多课程设计源码用的是LIMIT offset, pageSize这种物理分页,这本身没问题,但参数是写死的。你把它改成“分类筛选 + 花名模糊搜索 + 价格区间”同时生效,才是答辩时能讲清楚的分页查询。

改造的关键在 DAO 层拼接 SQL:

public List<Flower> searchFlowers(String keyword, Integer categoryId, BigDecimal minPrice, BigDecimal maxPrice, int offset, int pageSize) { StringBuilder sql = new StringBuilder( "SELECT * FROM flower WHERE 1=1 "); List<Object> params = new ArrayList<>(); if (keyword != null && !keyword.trim().isEmpty()) { sql.append("AND name LIKE ? "); params.add("%" + keyword.trim() + "%"); } if (categoryId != null) { sql.append("AND category_id = ? "); params.add(categoryId); } if (minPrice != null) { sql.append("AND price >= ? "); params.add(minPrice); } if (maxPrice != null) { sql.append("AND price <= ? "); params.add(maxPrice); } sql.append("ORDER BY id DESC LIMIT ?, ?"); params.add(offset); params.add(pageSize); return jdbcTemplate.query(sql.toString(), params.toArray(), flowerRowMapper); }

这里有个写 SQL 的技巧:WHERE 1=1不是无聊的语法,而是为了后续拼接AND条件时不用判断“是否是第一个条件”。虽然有些老派 DBA 不喜欢这种写法,但在动态查询场景里它是最省心、最不会拼出语法错误的做法。参数全部用?占位符传值,避免字符串拼接注入风险。

对应的分页参数计算,一页显示 6 个花材:

int pageSize = 6; int page = request.getParameter("page") == null ? 1 : Integer.parseInt(request.getParameter("page")); int offset = (page - 1) * pageSize; int totalCount = flowerDao.countFlowers(keyword, categoryId, minPrice, maxPrice); int totalPages = (int) Math.ceil((double) totalCount / pageSize);

花店前台展示通常希望每页 3 列、每列 2 行,所以pageSize = 6是常见的视觉友好配置。总页数计算必须用Math.ceil向上取整,否则第 2 页会漏掉不足一页的余数数据。

5. 部署与修改中的避坑记录:数据库打不开、订单金额对不上、状态改不动

5.1 数据库相关的坑:编码、端口、SSL 警告

现象:导入 SQL 后中文全是问号,后台花材名称显示乱码。

原因:SQL 文件本身的编码和数据库会话编码不一致。最常见的是脚本用 GBK 编码保存,而导入窗口默认使用 UTF-8。

解决:用记事本、VS Code 或 Sublime 打开.sql文件,查看右下角编码格式。如果是 GBK,先转成 UTF-8 保存后再导入;如果坚持原样导入,则在 MySQL 命令行执行SET NAMES gbk;再SOURCE。这个坑在基于 java 的花店管理系统里极具代表性,因为中国天气与花名文案都是中文,一个乱码能毁掉整个演示效果。

现象:Tomcat 启动正常,但一旦点击“商品列表”就报Access denied for user 'root'@'localhost'。

原因:数据库连接配置里的用户名或密码与本地 MySQL 实际账号不一致。

解决:去db.properties或jdbc.properties核对账号密码。注意一个细节:MySQL 5.7 默认的 root 如果设置了密码,而源码里写的是空密码,连接时也会报这个错。不要直接改 MySQL 认证方式,而是把配置文件里的密码改成正确的即可。

5.2 部署与运行时的坑:Tomcat 端口冲突和 jar 包冲突

现象:startup.sh运行后,浏览器访问http://localhost:8080显示的是别的项目,或者直接报端口占用。

原因:本机已有一个 Tomcat 实例占用了 8080 端口,或者 IDE(IDEA/Eclipse)内置的 Tomcat 和你命令行的 Tomcat 冲突。

解决:执行以下命令查找占用进程:

lsof -i :8080 # Mac/Linux netstat -ano | findstr :8080 # Windows

找到 PID 后结束对应进程,或者修改 Tomcat 的conf/server.xml里<Connector port="8080">为 8081。改端口后访问路径变成http://localhost:8081/flower_shop,对于部署在云服务器上的场景,还需要确认防火墙放行对应端口。

现象:Tomcat 启动时报ClassNotFoundException: com.mysql.jdbc.Driver,但lib目录下明明有mysql-connector-java.jar。

原因:jar 包放在了项目的src目录下,但没被构建到WEB-INF/lib。Eclipse 老项目经常会漏这一步。

解决:手动把 MySQL 驱动 jar 复制到webapps/flower_shop/WEB-INF/lib/下,然后重启 Tomcat。

5.3 业务逻辑上的坑:金额精度、库存扣减、状态跳变

现象:订单列表页显示的总金额出现类似29.999999这种数据。

原因:源码在计算购物车总价时用了double相乘。0.1 + 0.2在二进制浮点数里不等于0.3,这是 Java 基础里讲过的浮点精度问题,却在真实项目里反复咬人。

解决:所有金额计算改用BigDecimal。推荐用字符串构造器而非double构造器:

BigDecimal price = new BigDecimal("9.9"); BigDecimal quantity = new BigDecimal(String.valueOf(count)); BigDecimal subtotal = price.multiply(quantity);

现象:用户在前台重复点击“提交订单”,后台生成了多条一模一样的订单。

原因:前端没有做防重复提交,后端也没有校验“同一用户同一时间对同一花材的未支付订单是否已存在”。

解决:最省事的处理是在订单生成接口里加一个短时间幂等判断。用 Session 存储最后一次订单提交时间,或者用数据库唯一索引约束order_no。实际项目里更推荐后端生成唯一order_no,当重复点击时,第二次请求因为相同订单号会触发唯一索引冲突,代码捕获异常后直接返回第一次的订单信息。

现象:后台把订单状态从“配送中”点成“已完成”后,想撤销但页面没有按钮。

原因:源码没有实现状态回退。

解决:参考前面 4.2 节的状态机写法,允许已完成订单回退到配送中,这样才算给运营留了“后悔药”。演示过程中误操作是常态,没有回退路径就只能去改数据库,十分被动。

6. 从课程设计到真正能“用起来”:给花店管理系统补上的四个进阶方向

如果这份源码你已经跑通并且答辩结束,接下来建议做四件“靠近真实业务”的事。第一,把登录密码从明文或 MD5 改成 BCrypt 加盐哈希,这是花店系统能否见人的底线;第二,给订单扣库存的操作加上事务控制,用@Transactional保证扣库存和生成订单同时成功或同时失败;第三,加一个简单的按日销售统计,用一条GROUP BY DATE(create_time)的 SQL 就好;第四,把硬编码的数据库连接参数挪到环境变量或配置中心。其中第二点最值得花时间,因为这是“java怎么保证数据一致性”在业务里最直接的答案:同一个用户并发下单时,如果不锁库存或不做事务,花店卖出去了 100 束玫瑰但库存只减了 1,这是真实翻车现场。

做过这个项目之后我有个习惯:拿到任何源码包,第一件事永远是先打开数据库脚本,看清楚了订单和商品的两条主链,再回头看代码。很多看似神秘的 Bug,其实在建表那一步就已经注定了。希望这份拆解能帮你把“基于java的花店管理系统源码+数据库.zip”跑通、改顺、讲明白,也希望你在改造它的过程中,真正把手里的 Java 基础串成一条线。希望帮到你。

本文还有配套的精品资源,点击获取

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

鸿蒙端云一体化云存储实战:安全规则、上传下载与断点续传

做了前面几篇铺垫&#xff0c;终于可以聊到云存储了。把鸿蒙端云一体化开发里最容易被忽略、但实际坑最多的这部分单独拎出来写&#xff0c;是因为页面和接口做完后&#xff0c;一旦涉及文件上传下载、权限管控、存储配额&#xff0c;你会发现原有的本地思维完全不够用。这篇文…

作者头像 李华
网站建设 2026/9/28 11:32:09

Socket服务器多任务连接与广播消息设计:从线程模型到粘包拆包

搞实时通信的服务端开发&#xff0c;绕不开一个场景&#xff1a;一台服务器要同时扛住成百上千个客户端连接&#xff0c;还得把消息实时广播出去。聊天室、弹幕推送、物联网设备状态上报、金融行情推送&#xff0c;本质都是这套逻辑。今天把“Socket服务器多任务连接与广播消息…

作者头像 李华
网站建设 2026/9/28 11:28:54

【MyBatis系列3】MyBatis SQL执行流程

主要讲解MyBatis中SQL的执行流程&#xff0c;基于MyBatis的基础知识进行更深层次的剖析。前言在《【MyBatis系列1】基础知识&#xff08;上&#xff09;》中&#xff0c;我们讲解了MyBaits的工作原理&#xff0c;以及它的四大核心组件的使用姿势&#xff0c;包括SqlSessionFact…

作者头像 李华