airvo2怎么用MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

新闻资讯2026-04-20 22:42:42

在使用MyBatis执行如下SQL时出现Druid解析异常:

 <select id="selectListMzHairVoById" resultMap="MzPinHairMap">
  select ... where pin_no like "%"#{id}"%"
  </select>

报错信息:

log merge sql error, dbType mysql, druid-1.2.9, sql : ... like '%'?'%' com.alibaba.druid.sql.parser.ParserException: not supported.pos 155...

MyBatis会将 "%"#{id}"%" 解析为:

sql WHERE pin_no LIKE '%'?'%'

导致参数占位符被单引号包裹,MySQL无法识别这种语法结构

  • 字符串拼接问题:直接使用"%"#{id}"%"会导致预编译参数位置错误
  • SQL注入风险:虽然使用#{}是安全的,但错误的语法结构可能绕过预编译机制
  • Druid严格校验:阿里Druid连接池对SQL语法有严格校验(比MySQL原生更严格)
<select id="selectListMzHairVoById" resultMap="MzPinHairMap"> 
SELECT ... 
WHERE pin_no LIKE CONCAT('%', #{id}, '%') 
</select>

优势

  • 符合SQL标准语法
  • 100%预编译安全
  • 兼容所有数据库连接池
<select id="selectListMzHairVoById" resultMap="MzPinHairMap"> 
<bind name="pattern" value="'%' + id + '%'"/> 
SELECT ... WHERE pin_no LIKE #{pattern} 
</select>

适用场景:需要动态构造复杂匹配模式时使用

Service层:

public List<MzPinHairVo> query(String id) { 
String searchParam = "%" + id + "%"; 
return mapper.selectListMzHairVoById(searchParam);
 }

Mapper.xml:

<select id="selectListMzHairVoById" resultMap="MzPinHairMap">
 SELECT ... 
 WHERE pin_no LIKE #{id}
  </select>

注意事项:需确保参数来源可信,防止SQL注入

方案 安全性 可维护性 性能 跨数据库兼容性 CONCAT ★★★ ★★★ ★★★ ★★★ bind标签 ★★★ ★★☆ ★★☆ ★★★ Java拼接 ★★☆ ★☆☆ ★★★ ★★★

到此这篇关于MyBatis模糊查询报错:ParserException: not supported.pos 问题解决的文章就介绍到这了,更多相关MyBatis模糊查询报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!