Mybatis order by 動(dòng)態(tài)傳參出現(xiàn)的問題及解決方法
一個(gè)簡單的需求,要求把和當(dāng)前用戶相關(guān)的數(shù)據(jù)置頂展示。
這里,我用了一個(gè)簡單的用戶表來復(fù)現(xiàn)這個(gè)需求。
很簡單,查詢語句后面加上:order by t.login_name=’wulaoer’ desc 就行了。
如下所示,吳老二就到頂了。
那Mybatis腳本怎么寫呢?
就這么寫👇🏻
<select resultType='cn.fighter3.entity.User'>select * from user torder by t.login_name=#{req.currentUser} desc </select>
OK,需求完成,測試,摸……
嗯,出bug了……
問題現(xiàn)場定晴一看控制臺(tái),報(bào)錯(cuò)了。
最關(guān)鍵的一行:
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
問題分析問題很簡單,隨手一查,原因是:
#{}傳過來的參數(shù)帶單引號
#{}采用預(yù)編譯機(jī)制,是占位符,#{}傳入?yún)?shù)是以字符串傳入,會(huì)將SQL中的#{}替換為?號,調(diào)用PreparedStatement的set方法來賦值。
這種方式,order by 最后的sql會(huì)多加單引號 ’ 。
那怎么解決呢?
可以用 ${}。${}是拼接符,直接字符串替換。
<select resultType='cn.fighter3.entity.User'>select * from user torder by t.login_name=${req.currentUser} desc </select>
我不想用${}這種方式,因?yàn)橛衧ql注入的風(fēng)險(xiǎn),那該怎么辦呢?
好吧,其實(shí)主要是這種方式也報(bào)錯(cuò)了😓。
java.sql.SQLSyntaxErrorException: Unknown column ’wulaoer’ in ’order clause’
我們平時(shí)模糊查詢怎么寫呢?
——使用CONCAT()函數(shù)來拼接keyword。
以此類推,那我用一個(gè)函數(shù)來去掉’不就行了。
那用一個(gè)什么函數(shù)呢?
——REPLACE
所以寫法就變成了這樣:
<select resultType='cn.fighter3.entity.User'>select * from user torder by t.login_name=REPLACE(#{req.currentUser},’’’,’’) desc </select>問題解決
OK,最終問題解決。
<select resultType='cn.fighter3.entity.User'>select * from user torder by t.login_name=REPLACE(#{req.currentUser},’’’,’’) desc </select>
上去吧,吳老二!
問題比較簡單,處理起來也是三下五除二,但是分析的過程還有點(diǎn)意思,所以發(fā)出來給大家瞧瞧。
到此這篇關(guān)于Mybatis order by 動(dòng)態(tài)傳參出現(xiàn)的一個(gè)小bug的文章就介紹到這了,更多相關(guān)Mybatis order by 動(dòng)態(tài)傳參出現(xiàn)的一個(gè)小bug內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. sql語句LEFT JOIN拼接表詳解2. 目前學(xué)習(xí)到的常用命令之Mariadb3. SQLite教程(四):內(nèi)置函數(shù)4. DB2 自動(dòng)遞增字段實(shí)現(xiàn)方法5. SQL Server數(shù)據(jù)庫的三種創(chuàng)建方法匯總6. 解決maven不能下載oracle jdbc驅(qū)動(dòng)的問題7. SQLite數(shù)據(jù)庫安裝及基本操作指南8. 國內(nèi)學(xué)院派專家對DB2 9新產(chǎn)品贊不絕口9. python之sqlalchemy創(chuàng)建表的實(shí)例詳解10. ubuntu下使用SQLite3的基本命令
