Java搜索功能核心是安全高效地将用户输入转为后端查询逻辑,需明确搜索类型、使用DTO校验参数、动态构建查询(MyBatis-Plus条件构造器)、防SQL注入、空值处理、分页控制、索引优化、结构化响应及限流防护。

Java开发搜索功能模块,核心是将用户输入的关键词或条件,转换为后端可执行的查询逻辑,并安全、高效地返回匹配结果。关键不在于堆砌技术,而在于理清数据流向:前端传参 → 后端解析条件 → 构建动态查询 → 执行并封装响应。
明确搜索类型:关键词模糊查 or 多字段组合条件查
先区分业务场景。如果只是“按商品名搜索”,用 LIKE + 参数绑定即可;如果是“价格区间+分类+上架时间+是否促销”等组合筛选,则需动态拼接 WHERE 子句或使用条件构造器。
- 简单模糊搜索:用 MyBatis 的
#{}防 SQL 注入,配合数据库的CONCAT('%', #{keyword}, '%')实现前后模糊匹配 - 复杂条件查询:推荐用 MyBatis-Plus 的 QueryWrapper 或 LambdaQueryWrapper,通过链式调用 add() 方法按需追加条件,避免手拼 SQL 出错
- 注意空值处理:前端可能传空字符串或 null,后端需主动判断跳过该条件,否则查出意外全表数据
后端接收与校验搜索参数
定义专用 DTO(如 SearchConditionDTO)接收参数,比直接用 Map 更清晰、可复用。用 @NotBlank、@Min 等注解做基础校验,再在 Service 层补充业务规则(例如:结束时间不能早于开始时间)。
- 不要信任前端传来的任何值——即使有前端校验,后端仍需二次过滤非法字符(如 SQL 关键字、脚本标签)
- 对关键词做 trim() 和长度限制(如 ≤50 字),防止超长输入拖慢数据库或触发日志告警
- 分页必须显式控制:传入 pageNum 和 pageSize,用 PageHelper 或 MyBatis-Plus 自带分页插件,禁用无限制 LIMIT
构建安全高效的查询逻辑
避免用字符串拼接 SQL,尤其拼接用户输入。优先走预编译参数化查询路径。若涉及多表关联(如查订单+用户+商品信息),注意用 LEFT JOIN 控制主表,并给关联字段加索引。
立即学习“Java免费学习笔记(深入)”;
- MyBatis 中用
包裹动态 SQL 片段 - MyBatis-Plus 示例:
wrapper.between("price", minPrice, maxPrice).eq("status", 1).like("title", keyword) - 高频搜索字段(如 title、nickname)建议加 联合索引,顺序按查询频率和选择性排列,避免全表扫描
返回结构化结果并处理异常
搜索结果统一包装为 Result>
格式,含 code、msg、data、total 等字段。查不到数据不是错误,应返回空列表 + total=0;但数据库连接失败、SQL 语法错等才抛异常并记录日志。
- 敏感字段(如手机号、身份证号)在返回前脱敏,可用 @JsonSerialize 自定义序列化器
- 支持高亮关键词:用 Elasticsearch 或 Lucene 可原生实现;纯数据库方案可在 Java 层用 String.replace() 简单包裹 标签(仅限展示层)
- 搜索接口加基础限流(如 Guava RateLimiter),防恶意刷量压垮 DB










