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注入风险:
String keyword = "北京"; // 用户输入的搜索词 String sql = "SELECT * FROM users WHERE address LIKE ?"; try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 设置参数:通配符%添加到值中(非SQL语句中) pstmt.setString(1, "%" + keyword + "%"); // 匹配包含"北京"的地址 try (ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { System.out.println(rs.getString("address")); } } } catch (SQLException e) { e.printStackTrace(); }
通配符使用示例
匹配场景 | 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]。
[1] Oracle JDBC Tutorial
[2] OWASP SQL Injection Prevention
[3] MySQL Index Optimization
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/31120.html