Java中SQL LIKE语句如何实现?
- 后端开发
- 2025-06-19
- 6
在Java中使用SQL的 LIKE时,需结合通配符 %或 _,通过 PreparedStatement设置参数, ,“ java,String sql = "SELECT * FROM table WHERE column LIKE ?";,PreparedStatement ps = connection.prepareStatement(sql);,ps.setString(1, "%keyword%"); // 包含keyword的任意位置,ResultSet rs = ps.executeQuery();,` ,注意用% 匹配任意字符序列,_`匹配单个字符,参数值需手动添加通配符。
在Java中执行SQL的LIKE查询时,需结合JDBC的PreparedStatement实现安全高效的模糊匹配,以下是详细实现方案:

SQL LIKE的作用
LIKE用于在WHERE子句中进行模糊匹配,支持两种通配符:
- :匹配任意长度字符(包括0个字符)
- _:匹配单个字符
name LIKE '张%' 匹配所有以“张”开头的姓名。
Java中安全实现LIKE查询(防SQL载入)
必须使用PreparedStatement而非Statement,避免SQL载入风险:
通配符使用示例
| 匹配场景 | SQL示例 | Java参数设置 |
|---|---|---|
| 以”技术”开头 | LIKE '技术%' | pstmt.setString(1, "技术%") |
| 以”有限公司”结尾 | LIKE '%有限公司' | pstmt.setString(1, "%有限公司") |
| 包含”咖啡” | LIKE '%咖啡%' | pstmt.setString(1, "%咖啡%") |
| 第二个字符是”A” | LIKE '_A%' | pstmt.setString(1, "_A%") |
转义特殊字符
若需匹配包含或_的文本(如25%),使用ESCAPE子句:

String search = "25%"; // 用户输入含%的文本 String sql = "SELECT * FROM products WHERE discount LIKE ? ESCAPE '!'"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { // 转义%为!%,转义_为!_ String escapedValue = search.replace("!", "!!") .replace("%", "!%") .replace("_", "!_"); pstmt.setString(1, "%" + escapedValue + "%"); // 执行查询... }
性能优化与注意事项
- 索引问题:
- 前缀匹配(如LIKE '张%')可能使用索引
- 后缀匹配(LIKE '%北京')或全通配(LIKE '%咖啡%')会导致全表扫描,大数据表需谨慎
- 输入验证:清理用户输入中的非法字符(如分号、引号)
- 连接池管理:使用Druid、HikariCP等连接池提升性能
- 替代方案:全文搜索需求考虑Elasticsearch或数据库内置全文索引(如MySQL的FULLTEXT)
最佳实践总结:
- 始终用PreparedStatement传参(禁止字符串拼接SQL)
- 通配符/_通过Java字符串拼接,而非硬编码在SQL中
- 敏感字符(如)需显式转义
- 高频模糊查询场景建议引入专用搜索技术
引用说明:
本文代码示例遵循Oracle官方JDBC指南[1],安全规范参考OWASP SQL载入防护建议[2],性能优化部分依据MySQL 8.0索引文档[3]。
[2] OWASP SQL Injection Prevention
