上一篇
在JavaWeb中实现种类查询,需创建数据库连接,编写Servlet接收请求参数,使用JDBC执行SQL查询语句,将结果集转换为Java对象并返回JSON数据,前端通过Ajax调用展示结果。
技术栈与环境准备
- 基础技术:Servlet + JSP + JDBC
- 数据库:MySQL(示例)
- 依赖:MySQL Connector/J(驱动)、Tomcat 10+ 服务器
- 工具:Maven管理依赖(可选)
数据库设计
以商品分类表 category 为例:
CREATE TABLE category (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL, -- 分类名称
parent_id INT DEFAULT 0, -- 父级ID (0表示顶级分类)
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
字段说明:

id:主键parent_id:实现多级分类(如父级为0表示根分类)- 索引建议:为
parent_id添加索引加速查询
后端实现(分层架构)
实体类(Model层)
public class Category {
private int id;
private String name;
private int parentId;
// getters & setters 省略
}
DAO层(数据访问)
public class CategoryDao {
public List<Category> getAllCategories() throws SQLException {
List<Category> list = new ArrayList<>();
String sql = "SELECT id, name, parent_id FROM category";
try (Connection conn = DataSourceUtil.getConnection(); // 自定义连接池工具
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
Category cat = new Category();
cat.setId(rs.getInt("id"));
cat.setName(rs.getString("name"));
cat.setParentId(rs.getInt("parent_id"));
list.add(cat);
}
}
return list;
}
}
Service层(业务逻辑)
public class CategoryService {
private CategoryDao categoryDao = new CategoryDao();
public List<Category> fetchAllCategories() {
try {
return categoryDao.getAllCategories();
} catch (SQLException e) {
e.printStackTrace();
return Collections.emptyList(); // 失败返回空集合
}
}
}
Servlet(Controller层)
@WebServlet("/category/list")
public class CategoryListServlet extends HttpServlet {
private CategoryService service = new CategoryService();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Category> categories = service.fetchAllCategories();
request.setAttribute("categories", categories); // 数据传递到JSP
// 转发到展示页面
request.getRequestDispatcher("/WEB-INF/jsp/category_list.jsp").forward(request, response);
}
}
前端展示(JSP示例)
文件路径:/WEB-INF/jsp/category_list.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>商品分类列表</title>
</head>
<body>
<h2>全部分类</h2>
<ul>
<c:forEach items="${categories}" var="cat">
<li>${cat.name} (ID: ${cat.id})</li>
</c:forEach>
</ul>
</body>
</html>
性能与安全优化
- 连接池:使用Tomcat JDBC Pool或HikariCP替代直连
- 防SQL注入:坚持用
PreparedStatement - 缓存策略:
- 频繁查询的分类数据存入Redis(代码示例):
// Service层添加缓存逻辑 public List<Category> fetchAllCategories() { String cacheKey = "all_categories"; List<Category> list = redisTemplate.opsForValue().get(cacheKey); if (list == null) { list = categoryDao.getAllCategories(); // 查数据库 redisTemplate.opsForValue().set(cacheKey, list, 30, TimeUnit.MINUTES); } return list; }
- 频繁查询的分类数据存入Redis(代码示例):
- 树形结构展示:递归实现多级分类
// 递归构建树形结构 public List<Category> buildCategoryTree(List<Category> list, int parentId) { return list.stream() .filter(cat -> cat.getParentId() == parentId) .peek(cat -> cat.setChildren(buildCategoryTree(list, cat.getId()))) .collect(Collectors.toList()); }
常见问题解决
- 乱码问题:
- Servlet中加
response.setContentType("text/html;charset=UTF-8"); - JSP顶部加
<%@ page pageEncoding="UTF-8"%>
- Servlet中加
- 空指针异常:Service层返回空集合而非
null - 跨层级查询:SQL递归查询(MySQL 8.0+ 使用
WITH RECURSIVE)
JavaWeb种类查询的核心步骤:

- 设计合理的数据库表结构
- 遵循MVC分层:DAO操作数据库 → Service处理业务 → Servlet控制流程
- 前端JSP通过JSTL展示数据
- 优化方向:连接池、缓存、异步加载
引用说明:本文代码基于Servlet 4.0规范,数据库操作遵循JDBC标准,缓存示例采用Spring Data Redis实现,安全建议参考OWASP SQL注入防护指南,性能优化部分借鉴了《阿里巴巴Java开发手册》。
通过此实现,可快速构建高可用的种类查询功能,代码结构清晰且易于扩展至复杂业务场景。

