Java中PreparedStatement实现安全模糊查询的核心是将通配符写在参数值中而非SQL模板里,如setString(1, "%" + keyword + "%");错误做法包括字符串拼接或在SQL中写'%?%';特殊字符需转义并配合ESCAPE使用。

Java 中 PreparedStatement 实现安全的模糊查询,核心在于不拼接 SQL 字符串,而是用参数占位符(?)配合 setString() 方法传入带通配符的值。通配符(如 %、_)必须写在 Java 字符串里,不能写在 SQL 模板中。
正确写法:通配符放在参数值中
✅ 安全、推荐的方式:
- SQL 模板写成:
SELECT * FROM user WHERE name LIKE ? - Java 中构造参数:
stmt.setString(1, "%" + keyword + "%"); - 这样既防止 SQL 注入,又支持前后模糊匹配
常见错误写法及风险
❌ 危险示例(绝对避免):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
"SELECT * FROM user WHERE name LIKE '%" + keyword + "%'"—— 直接字符串拼接,keyword 若为admin' OR '1'='1就会引发注入 -
stmt.setString(1, keyword);配合 SQL 写成LIKE '%?%'—— PreparedStatement 不识别?%中的问号,会报错或查不到结果
处理特殊字符(如 %、_、)
如果用户输入本身就含通配符(比如查名字叫 “100% Pure” 的商品),需转义并指定 escape 字符:
立即学习“Java免费学习笔记(深入)”;
- SQL 改为:
WHERE name LIKE ? ESCAPE '' - Java 中预处理:
String escaped = keyword.replace("\", "\\").replace("%", "\%").replace("_", "\_"); - 再设置:
stmt.setString(1, "%" + escaped + "%");
其他实用技巧
可根据需求灵活组合通配符:
- 前缀匹配:
stmt.setString(1, keyword + "%");→LIKE ?(SQL 中) - 后缀匹配:
stmt.setString(1, "%" + keyword); - 精确匹配单字符位置:
stmt.setString(1, "a_" + keyword);(注意下划线是单字符通配)

















