PreparedStatement模糊查询需将通配符%或_拼在参数值中而非SQL里;用户输入含特殊字符时须转义并配合ESCAPE;按需使用前缀、后缀、全模糊及单字符匹配;注意空值判空防注入。

在 Java 中用 PreparedStatement 做 LIKE 模糊查询时,关键在于:**通配符(% 或 _)必须作为参数值的一部分拼接到字符串中,不能写死在 SQL 语句里**。否则预编译会把 ? 当作字面量处理,导致查不到数据或语法错误。
LIKE 的通配符要放在参数值里,不是 SQL 字符串里
错误写法(SQL 中硬拼 %?%):
String sql = "SELECT * FROM user WHERE name LIKE '%?%'"; // ❌ 危险!? 不会被识别为参数
正确写法(通配符和参数值一起传入):
立即学习“Java免费学习笔记(深入)”;
✅ 推荐方式:在 Java 代码中拼接通配符
- 使用
String.format或StringBuilder构造带通配符的参数值 - 再把该值用
setString绑定到?
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
String keyword = "张";<br>String sql = "SELECT * FROM user WHERE name LIKE ?";<br>PreparedStatement ps = conn.prepareStatement(sql);<br>ps.setString(1, "%" + keyword + "%"); // ✅ 参数值含 %<br>ResultSet rs = ps.executeQuery();
处理用户输入中的特殊字符(如 %、_、)
如果用户输入本身就含 % 或 _,又想按字面意思匹配(而非通配),需转义 + 指定 ESCAPE 字符。
步骤:
- 选择一个转义符(如
),并在 SQL 中声明ESCAPE '' - 对用户输入中的
%、_、提前加转义符 - 参数值中包含转义后的字符串
示例(查名字里真有百分号的用户):
String userInput = "100%";<br>// 转义:100% → 100%<br>String escaped = userInput.replace("\", "\\").replace("%", "\%").replace("_", "\_");<br>String sql = "SELECT * FROM product WHERE title LIKE ? ESCAPE '\'";<br>ps.setString(1, "%" + escaped + "%");
前缀、后缀、全模糊的写法区别
根据业务场景灵活组合通配符:
-
前缀匹配(以…开头):
ps.setString(1, keyword + "%");→WHERE name LIKE '张%' -
后缀匹配(以…结尾):
ps.setString(1, "%" + keyword);→WHERE name LIKE '%三' -
全模糊(包含…):
ps.setString(1, "%" + keyword + "%");→WHERE name LIKE '%小%' -
单字符占位(_):
ps.setString(1, "王_");→ 匹配“王五”“王二”,但不匹配“王小明”
注意 SQL 注入与空值安全
PreparedStatement 本身防注入,但要注意:
- 不要用字符串拼接构造整个 SQL(比如
"... LIKE '%" + keyword + "%'")—— 这就失去预编译意义,且可能被注入 - 如果
keyword为null,"%" + null + "%"会变成"%null%",应提前判空 - 建议加空值/空白检查:
if (keyword == null || keyword.trim().isEmpty()) { ... }

















