MyBatis模糊查詢報錯:ParserException: not supported.pos 問題解決
問題描述
在使用MyBatis執(zhí)行如下SQL時出現(xiàn)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 '%'?'%'
導(dǎo)致參數(shù)占位符被單引號包裹,MySQL無法識別這種語法結(jié)構(gòu)
深層原因分析
- 字符串拼接問題:直接使用
"%"#{id}"%"
會導(dǎo)致預(yù)編譯參數(shù)位置錯誤 - SQL注入風(fēng)險:雖然使用
#{}
是安全的,但錯誤的語法結(jié)構(gòu)可能繞過預(yù)編譯機制 - Druid嚴(yán)格校驗:阿里Druid連接池對SQL語法有嚴(yán)格校驗(比MySQL原生更嚴(yán)格)
三種解決方案
方案一:使用CONCAT函數(shù)(推薦)
<select id="selectListMzHairVoById" resultMap="MzPinHairMap"> SELECT ... WHERE pin_no LIKE CONCAT('%', #{id}, '%') </select>
優(yōu)勢:
- 符合SQL標(biāo)準(zhǔn)語法
- 100%預(yù)編譯安全
- 兼容所有數(shù)據(jù)庫連接池
方案二:bind標(biāo)簽綁定參數(shù)
<select id="selectListMzHairVoById" resultMap="MzPinHairMap"> <bind name="pattern" value="'%' + id + '%'"/> SELECT ... WHERE pin_no LIKE #{pattern} </select>
適用場景:需要動態(tài)構(gòu)造復(fù)雜匹配模式時使用
方案三:Java端預(yù)拼接參數(shù)
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>
注意事項:需確保參數(shù)來源可信,防止SQL注入
方案對比
方案 | 安全性 | 可維護(hù)性 | 性能 | 跨數(shù)據(jù)庫兼容性 |
---|---|---|---|---|
CONCAT | ★★★ | ★★★ | ★★★ | ★★★ |
bind標(biāo)簽 | ★★★ | ★★☆ | ★★☆ | ★★★ |
Java拼接 | ★★☆ | ★☆☆ | ★★★ | ★★★ |
到此這篇關(guān)于MyBatis模糊查詢報錯:ParserException: not supported.pos 問題解決的文章就介紹到這了,更多相關(guān)MyBatis模糊查詢報錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式
在Java中處理文件向來是一種不是很方便的操作,然后隨著Spring框架的崛起,使用Spring框架中的MultipartFile來處理文件也是件很方便的事了,今天就給大家介紹Spring將MultipartFile轉(zhuǎn)存到本地磁盤的方式,需要的朋友可以參考下2024-10-10spring?cloud?eureka注冊原理-注冊失敗填坑筆記
這篇文章主要介紹了spring?cloud?eureka注冊原理-注冊失敗填坑筆記,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05SpringBoot導(dǎo)出Excel的四種實現(xiàn)方式
近期接到了一個小需求,要將系統(tǒng)中的數(shù)據(jù)導(dǎo)出為Excel,且能將Excel數(shù)據(jù)導(dǎo)入到系統(tǒng),對于大多數(shù)研發(fā)人員來說,這算是一個最基本的操作了,本文就給大家總結(jié)一下SpringBoot導(dǎo)出Excel的四種實現(xiàn)方式,需要的朋友可以參考下2024-01-01java如何將實體類轉(zhuǎn)換成json并在控制臺輸出
這篇文章主要介紹了java如何將實體類轉(zhuǎn)換成json并在控制臺輸出問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11關(guān)于@ComponentScan?TypeFilter自定義指定掃描bean的規(guī)則
這篇文章主要介紹了關(guān)于@ComponentScan?TypeFilter自定義指定掃描bean的規(guī)則,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09IDEA創(chuàng)建Java?Web項目的超詳細(xì)圖文教學(xué)
IDEA是程序員們常用的java集成開發(fā)環(huán)境,也是被公認(rèn)為最好用的java開發(fā)工具,下面這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建Java?Web項目的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12