当前位置:首页 > 后端开发 > 正文

Java中SQL LIKE语句如何实现?

在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子句中进行模糊匹配,支持两种通配符:

Java中SQL LIKE语句如何实现?  第1张

  • :匹配任意长度字符(包括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 + "%");
    // 执行查询...
}

性能优化与注意事项

  1. 索引问题
    • 前缀匹配(如LIKE '张%')可能使用索引
    • 后缀匹配(LIKE '%北京')或全通配(LIKE '%咖啡%')会导致全表扫描,大数据表需谨慎
  2. 输入验证:清理用户输入中的非规字符(如分号、引号)
  3. 连接池管理:使用Druid、HikariCP等连接池提升性能
  4. 替代方案:全文搜索需求考虑Elasticsearch或数据库内置全文索引(如MySQL的FULLTEXT)

最佳实践总结

  1. 始终用PreparedStatement传参(禁止字符串拼接SQL)
  2. 通配符/_通过Java字符串拼接,而非硬编码在SQL中
  3. 敏感字符(如)需显式转义
  4. 高频模糊查询场景建议引入专用搜索技术

引用说明
本文代码示例遵循Oracle官方JDBC指南[1],安全规范参考OWASP SQL注入防护建议[2],性能优化部分依据MySQL 8.0索引文档[3]。


[1] Oracle JDBC Tutorial
[2] OWASP SQL Injection Prevention
[3] MySQL Index Optimization

0