在使用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}"%"会导致预编译参数位置错误#{}是安全的,但错误的语法结构可能绕过预编译机制<select id="selectListMzHairVoById" resultMap="MzPinHairMap">
SELECT ...
WHERE pin_no LIKE CONCAT('%', #{id}, '%')
</select>
优势:
<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注入
到此这篇关于MyBatis模糊查询报错:ParserException: not supported.pos 问题解决的文章就介绍到这了,更多相关MyBatis模糊查询报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!