在Java应用开发中,模糊查询是一项非常常见的需求,它允许用户根据部分信息检索匹配的数据,SQL语句中的LIKE操作是实现模糊查询的核心,而Java作为后端开发语言,需要与数据库交互执行这些查询,本文将详细介绍Java中模糊查询SQL语句的写法,包括基础语法、参数绑定、性能优化以及不同场景下的实现方式。

基础LIKE语法与Java实现
模糊查询的基础是SQL的LIKE操作符,配合通配符使用,通配符主要包括两种:
- 表示任意数量的任意字符(包括零个字符)
_:表示单个任意字符
在Java中,通常通过JDBC或ORM框架(如MyBatis、Hibernate)执行SQL语句,以JDBC为例,基础实现步骤如下:
String sql = "SELECT * FROM users WHERE name LIKE ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, "%张%"); // 查询姓名中包含"张"的用户 ResultSet rs = pstmt.executeQuery();
这里使用PreparedStatement而非Statement,可以有效防止SQL注入攻击,并且能够正确处理特殊字符。
常见模糊查询场景及SQL写法
根据业务需求,模糊查询可分为多种场景,每种场景对应的SQL语句略有不同:
-
前缀匹配:查询以特定字符开头的数据
SELECT * FROM products WHERE code LIKE 'A%'
-
后缀匹配:查询以特定字符结尾的数据
SELECT * FROM articles WHERE title LIKE '%新闻'
-
中间匹配:查询包含特定字符的数据(最常用)
SELECT * FROM users WHERE address LIKE '%北京%'
-
固定长度匹配:查询第n位为特定字符的数据
SELECT * FROM orders WHERE order_no LIKE '____2023%' // 下划线表示单个字符
在Java中,这些场景可以通过动态拼接SQL参数实现:

String prefix = "A"; String sql = "SELECT * FROM products WHERE code LIKE ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, prefix + "%"); // 前缀匹配
使用MyBatis实现模糊查询
MyBatis作为主流的持久层框架,提供了更灵活的模糊查询方式:
-
XML配置方式:
<select id="findUsersByName" resultType="User"> SELECT * FROM users WHERE name LIKE CONCAT('%', #{name}, '%') </select> -
注解方式:
@Select("SELECT * FROM users WHERE name LIKE CONCAT('%', #{name}, '%')") List<User> findUsersByName(@Param("name") String name);
MyBatis还支持使用<bind>标签动态拼接查询条件:
<select id="searchUsers" resultType="User">
<bind name="pattern" value="'%' + keyword + '%'" />
SELECT * FROM users WHERE name LIKE #{pattern}
</select>
性能优化与注意事项
模糊查询虽然方便,但不当使用可能导致性能问题,需要注意以下几点:
-
避免全表扫描:
- 尽量避免在列的开头使用通配符,如
LIKE '%abc',这会导致索引失效 - 如果必须使用前缀模糊查询,考虑使用全文索引(如MySQL的FULLTEXT索引)
- 尽量避免在列的开头使用通配符,如
-
合理使用索引:
- 对于高频查询的列,确保建立了适当的索引
- 对于固定长度的匹配(如
LIKE '___abc'),索引可能仍然有效
-
限制结果集大小:
- 使用
LIMIT子句限制返回的记录数 - 在分页查询中,避免
OFFSET过大的问题
- 使用
-
参数化查询:

- 始终使用
PreparedStatement传递参数,避免字符串拼接SQL - 对于大量数据查询,考虑使用分页查询减少内存消耗
- 始终使用
高级模糊查询技巧
-
大小写不敏感查询:
SELECT * FROM users WHERE name LIKE '%john%' COLLATE utf8_general_ci
或在Java中统一转换为大写/小写:
pstmt.setString(1, "%" + keyword.toLowerCase() + "%");
-
多条件模糊查询:
SELECT * FROM users WHERE name LIKE '%张%' OR email LIKE '%zhang%'
-
正则表达式查询:
部分数据库(如PostgreSQL)支持正则表达式:SELECT * FROM users WHERE name ~ '张.*李'
-
使用ESCAPE处理特殊字符:
当查询条件包含通配符时,可以使用ESCAPE转义:SELECT * FROM products WHERE code LIKE 'A\_B%' ESCAPE '\'
安全防护
模糊查询容易受到SQL注入攻击,必须采取防护措施:
- 输入验证:对用户输入进行合法性检查
- 使用ORM框架:MyBatis、Hibernate等框架内置防护机制
- 限制查询长度:防止超长输入导致性能问题
- 白名单过滤:对查询关键字进行白名单验证
Java中实现模糊查询需要综合运用SQL语法、JDBC/ORM框架以及性能优化技巧,基础实现依赖于LIKE操作符和通配符的使用,而实际开发中应根据具体场景选择合适的查询方式,并始终关注性能和安全性问题,通过合理使用索引、参数化查询以及分页技术,可以在保证查询功能的同时,确保应用的稳定性和高效性,随着数据量的增长,还可以考虑引入全文搜索引擎(如Elasticsearch)来处理复杂的模糊查询需求。

















