基于JSP+Servlet的在线药店销售与库存管理系统 - 源码深度解析
在医药零售行业数字化转型的浪潮中,传统药店面临着库存信息不透明、销售数据滞后、人工操作易出错等核心挑战。一款高效、可靠的业务管理平台成为提升运营效率的关键。本系统采用经典的JSP+Servlet技术栈,构建了一个集药品销售、库存管理、采购供应链于一体的综合解决方案,我们将其命名为“药易管”——一个旨在实现药店业务全流程数字化闭环的智能管理引擎。
系统严格遵循MVC设计模式,Servlet作为控制器层负责请求调度和业务逻辑处理,JSP页面专注于数据展示,JavaBean实体类封装业务数据,JDBC实现与MySQL数据库的持久化交互。这种分层架构确保了代码的高内聚低耦合,为系统的可维护性和扩展性奠定了坚实基础。
系统架构与技术栈深度解析
“药易管”采用经典的三层架构设计,每一层都承担着明确的职责:
表现层(Presentation Layer)
- 使用JSP技术结合JSTL标签库和EL表达式
- 实现了数据与视图的清晰分离
- 避免了在页面中嵌入过多的Java代码脚本(Scriptlet)
- 采用响应式设计确保多设备兼容性
业务逻辑层(Business Logic Layer)
- 由Servlet构成,每个Servlet对应一个具体的业务模块
- 负责接收前端请求、验证参数、调用服务层方法
- 涵盖药品管理、订单处理、库存更新等核心业务
- 实现事务管理和异常处理机制
数据访问层(Data Access Layer)
- 通过封装JDBC操作,提供对数据库的安全、高效访问
- 采用DAO设计模式,隔离业务逻辑与数据访问细节
- 实现连接池管理,提升数据库访问性能
在技术选型上,系统选择了成熟稳定的技术组合:
- Java EE技术:Servlet 3.0+和JSP 2.0+技术经过多年发展,拥有完善的生态系统
- 数据库:MySQL 5.7+在事务处理和数据一致性方面表现出色
- 前端技术:HTML5+CSS3+JavaScript组合,确保界面兼容性和用户体验
- 服务器:Tomcat 8.0+作为Servlet容器,提供稳定的运行环境
数据库设计亮点与优化策略
药品表(drug)的核心设计
药品表作为系统的核心数据表,其设计体现了对业务需求的深刻理解:
CREATE TABLE `drug` (
`did` varchar(22) NOT NULL COMMENT '药品ID',
`dname` varchar(22) DEFAULT NULL COMMENT '药品名称',
`dclass` varchar(22) DEFAULT NULL COMMENT '药品类别',
`dprice` varchar(22) DEFAULT NULL COMMENT '售价',
`prodate` date DEFAULT NULL COMMENT '生产日期',
`exdate` date DEFAULT NULL COMMENT '过期日期',
`requantity` int(11) DEFAULT NULL COMMENT '库存数量',
`sname` varchar(33) NOT NULL COMMENT '生产商',
`function` varchar(33) DEFAULT NULL COMMENT '功效',
PRIMARY KEY (`did`),
KEY `supplier` (`sname`),
CONSTRAINT `drug_ibfk_1` FOREIGN KEY (`sname`) REFERENCES `supplier` (`sname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='药品表'
设计亮点分析:
- 主键设计:
did字段采用varchar(22)类型作为主键,便于嵌入药品分类、批次等业务信息 - 数据完整性:外键约束确保药品与供应商之间的引用完整性
- 业务约束:在应用层实现库存数量非负校验,确保业务逻辑正确性
- 索引优化:在供应商字段上建立索引,提升关联查询性能
订单表(ordered)的事务完整性设计
订单表的设计重点关注了销售业务的事务完整性:
CREATE TABLE `ordered` (
`oid` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`did` varchar(22) DEFAULT NULL COMMENT '药品ID',
`dname` varchar(22) DEFAULT NULL COMMENT '药品名称',
`oquantity` int(11) DEFAULT NULL COMMENT '购买数量',
`oprice` varchar(22) DEFAULT NULL COMMENT '总价',
`cid` int(11) DEFAULT NULL COMMENT '购买人',
`cname` varchar(22) DEFAULT NULL COMMENT '客户姓名',
`odate` datetime DEFAULT NULL COMMENT '销售日期',
PRIMARY KEY (`oid`),
KEY `did` (`did`),
KEY `cid` (`cid`),
CONSTRAINT `ordered_ibfk_1` FOREIGN KEY (`did`) REFERENCES `drug` (`did`),
CONSTRAINT `ordered_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `customer` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='订单表'
优化策略:
- 反范式设计:存储药品名称减少联表查询,提升读取性能
- 事务保障:通过数据库事务确保库存更新与订单创建的原子性
- 索引设计:多字段索引优化复杂查询条件
- 自增主键:确保订单ID的唯一性和连续性
采购表(purchase)的供应链追踪
采购表的设计体现了对药品供应链的完整追踪:
CREATE TABLE `purchase` (
`pid` varchar(22) NOT NULL COMMENT '采购ID',
`did` varchar(22) DEFAULT NULL COMMENT '药品ID',
`pquantity` int(11) DEFAULT NULL COMMENT '采购数量',
`purchaser` varchar(22) DEFAULT NULL COMMENT '采购人',
`pprice` varchar(22) DEFAULT NULL COMMENT '采购价格',
`pdate` date DEFAULT NULL COMMENT '采购日期',
PRIMARY KEY (`pid`),
KEY `did` (`did`),
CONSTRAINT `purchase_ibfk_1` FOREIGN KEY (`did`) REFERENCES `drug` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='采购表'
供应链管理特性:
- 批次追踪:采购ID支持嵌入批次信息,实现药品溯源
- 成本控制:记录采购价格,为成本核算提供数据支持
- 供应商评估:基于采购数据建立供应商绩效评估体系
核心功能实现详解
药品信息管理模块
药品管理是系统的核心功能之一,实现了完整的药品生命周期管理:
功能特性:
- 药品信息的增删改查(CRUD)操作
- 实时库存监控和预警机制
- 药品过期自动提醒功能
- 多条件组合查询和分页显示

Servlet控制器实现:
@WebServlet("/drugQuery")
public class DrugQueryServlet extends HttpServlet {
private DrugService drugService = new DrugService();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String drugId = request.getParameter("drugId");
String drugName = request.getParameter("drugName");
String category = request.getParameter("category");
try {
List<Drug> drugList = drugService.queryDrugs(drugId, drugName, category);
request.setAttribute("drugList", drugList);
request.getRequestDispatcher("/drugManagement.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
request.setAttribute("errorMsg", "查询失败:" + e.getMessage());
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
}
JSP视图层实现:
<table class="table table-striped">
<thead>
<tr>
<th>药品ID</th>
<th>药品名称</th>
<th>类别</th>
<th>售价</th>
<th>库存数量</th>
<th>生产日期</th>
<th>过期日期</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach var="drug" items="${drugList}">
<tr>
<td>${drug.did}</td>
<td>${drug.dname}</td>
<td>${drug.dclass}</td>
<td>${drug.dprice}</td>
<td>${drug.requantity}</td>
<td>${drug.prodate}</td>
<td>${drug.exdate}</td>
<td>
<a href="drugEdit?did=${drug.did}" class="btn btn-primary">编辑</a>
<a href="drugDelete?did=${drug.did}" class="btn btn-danger">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
库存管理优化策略
系统实现了智能库存管理机制:
- 安全库存预警:设置最低库存阈值,自动触发补货提醒
- 先进先出(FIFO):基于生产日期自动推荐出库顺序
- 库存周转分析:统计药品周转率,优化采购策略
- 效期管理:提前预警近效期药品,减少损失
销售与采购协同
系统通过销售数据驱动采购决策:
- 基于历史销售数据预测未来需求
- 自动生成采购建议清单
- 供应商绩效评估支持采购决策
- 采购到货自动更新库存
技术实现亮点
事务管理机制
系统采用数据库事务确保业务操作的原子性,特别是在库存更新和订单创建等关键操作中:
public class OrderService {
public boolean createOrder(Order order) throws SQLException {
Connection conn = null;
try {
conn = DataSourceUtil.getConnection();
conn.setAutoCommit(false);
// 1. 创建订单记录
orderDao.insertOrder(conn, order);
// 2. 更新库存
drugDao.updateStock(conn, order.getDid(), -order.getQuantity());
conn.commit();
return true;
} catch (SQLException e) {
if (conn != null) conn.rollback();
throw e;
} finally {
if (conn != null) conn.close();
}
}
}
性能优化策略
- 数据库连接池:使用DBCP或HikariCP管理数据库连接
- 查询优化:合理使用索引,避免全表扫描
- 页面缓存:对静态资源实施缓存策略
- 异步处理:耗时的报表生成采用异步任务处理
总结与展望
本系统通过JSP+Servlet技术栈成功构建了一个功能完善的药店管理系统,体现了传统Java Web技术在企业级应用中的稳定性和可靠性。系统架构清晰,代码可维护性强,为中小型药店提供了完整的数字化解决方案。
未来扩展方向:
- 引入Spring框架提升开发效率
- 增加移动端支持
- 集成第三方支付接口
- 实现数据分析和BI报表功能
- 扩展连锁药店多门店管理支持
该系统不仅解决了药店日常运营的核心痛点,更为后续的技术升级和功能扩展奠定了坚实基础。