MyBatis针对MySQL模糊查询中特殊字符(%和_)的处理方案
在使用MyBatis进行模糊查询时,你是否遇到过用户输入%或_导致查询结果异常返回全部数据的问题?本文将深入分析问题原因并提供完整的解决方案。
问题现象与原因分析
问题复现
在模糊查询场景中,当用户输入包含%或_时(如搜索%_),查询会返回全部数据而非预期结果。
-- 示例SQL
SELECT * FROM users WHERE username LIKE '%'#{searchKey}'%'
根本原因
在SQL中,%和_是LIKE操作符的特殊通配符:
- % 匹配任意长度字符(包括零个字符)
- _ 匹配单个字符
当用户输入中包含这些字符时,它们会被SQL解析为通配符而非普通字符,导致查询范围扩大。
解决方案
public class EscapeUtil {/*** 转义字符串中的特殊字符(_和%),使其在MySQL LIKE查询中作为普通字符匹配* @param input 待转义的字符串* @return 转义后的字符串(已trim),若输入为blank则原样返回*/public static String escapeLike(String input){if (StringUtils.isBlank(input)) {return input;}// 使用标准MySQL转义符(\)替代原代码中的/return input.trim().replace("\\", "\\\\").replace("_", "\\_").replace("%", "\\%");}
}