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

 更新时间:2025年04月29日 11:38:30   作者:很少更新  
本文主要介绍了MyBatis模糊查询报错:ParserException: not supported.pos 问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题描述

在使用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...

问题根源

错误SQL解析逻辑

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

sql WHERE pin_no LIKE '%'?'%'

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

深层原因分析

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

三种解决方案

方案一:使用CONCAT函数(推荐)

<select id="selectListMzHairVoById" resultMap="MzPinHairMap"> 
SELECT ... 
WHERE pin_no LIKE CONCAT('%', #{id}, '%') 
</select>

优势

  • 符合SQL标准语法
  • 100%预编译安全
  • 兼容所有数据库连接池

方案二:bind标签绑定参数

<select id="selectListMzHairVoById" resultMap="MzPinHairMap"> 
<bind name="pattern" value="'%' + id + '%'"/> 
SELECT ... WHERE pin_no LIKE #{pattern} 
</select>

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

方案三:Java端预拼接参数

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模糊查询报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Spring Boot文件上传简单实例代码

    Spring Boot文件上传简单实例代码

    在本篇文章里小编给大家分享的是关于Spring Boot 文件上传简易教程以及相关知识点,需要的朋友们参考下。
    2019-08-08
  • Java实现批量下载文件的示例代码

    Java实现批量下载文件的示例代码

    这篇文章主要为大家详细介绍了Java如何实现批量下载文件,并以压缩输出流的形式返回前端,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2023-10-10
  • 邻接表无向图的Java语言实现完整源码

    邻接表无向图的Java语言实现完整源码

    这篇文章主要介绍了邻接表无向图的Java语言实现完整源码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • javax NotBlank和Email注解失效的解决

    javax NotBlank和Email注解失效的解决

    这篇文章主要介绍了javax NotBlank和Email注解失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java开启新线程并传参方法代码实现

    Java开启新线程并传参方法代码实现

    这篇文章主要介绍了Java开启新线程并传参方法代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • springboot 日志实现过程

    springboot 日志实现过程

    Spring Boot 使用 SLF4J 作为日志门面,Logback 或 Log4j2 作为日志实现,日志门面提供统一接口,简化日志记录,实现负责具体功能,Spring Boot 默认使用 SLF4J 和 Logback,可以通过配置文件或注解进行日志记录和控制,感兴趣的朋友一起看看吧
    2025-01-01
  • 通过图例了解PowerDesigner使用方法

    通过图例了解PowerDesigner使用方法

    这篇文章主要介绍了通过图例了解PowerDesigner使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java中~运算符的含义及说明

    Java中~运算符的含义及说明

    Java中的~运算符表示非运算符,即将该数的所有二进制位全取反,但得到的是补码形式,需要将其转换为反码和原码才能得到最终的十进制结果
    2025-11-11
  • Mybatis动态调用表名和字段名的解决方法

    Mybatis动态调用表名和字段名的解决方法

    今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,这种情况下,就需要构建sql来动态传入表名、字段名了,下面给大家介绍mybatis动态调用表名和字段名的解决方法,一起看看吧
    2016-10-10
  • Java 十大排序算法之希尔排序刨析

    Java 十大排序算法之希尔排序刨析

    希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现
    2021-11-11

最新评论