使用MyBatis進行模糊查詢時%到底寫哪兒的解決辦法
介紹
這種解決辦法。。。感覺非常Nice!!
解決辦法
在我們以前寫sql語句的時候,我們通常是這樣寫的。
SELECT * FROM user WHERE username LIKE #{likeUser}
我們在Java程式碼中我們是這樣傳值的:
%FireLang%
到現在才知道,這種寫法太有耦合度了,程式碼寫得太醜了!!*\_/*
難看的臉。
sql語句不能夠在Java程式碼中出現,我們要做的只是傳入值,只是傳入值!!!
如果哪兒天MySql要大換血,把%廢了,那我們還要改Java程式碼??雖然可能性幾乎為零。但是我這裡講的是一種思想!!一種思想!!!任何地方都要儘可能的減少耦合!!!不要耦合!!不要耦合!!!
所以你表達了這麼多,現在能告訴我解決辦法了嗎??orz
解決辦法就是。。。
把查詢語句改為:
SELECT * FROM user WHERE username LIKE '%#{likeUser}%'
你覺得可以嗎??我這樣問你,你是否會思考這個問題到底有問題呢還是沒問題呢還是這個問題到底有沒有問題。。。暈沒有。。反正我暈了。這問題到底是不是問題。。這個問題的問題到底有沒有問題。。
試試不就知道咯!!
最終測試結果不盡人意。。。
Caused by: java.sql.SQLException: No parameters defined during prepareCall()
Caused by: org.apache .ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null .
哦豁。。。不得行!!!它說沒得第一個佔位符。
沒有第一個佔位符也就不可能把值設定進去了。看一下它傳送的sql語句:
Preparing: SELECT * FROM user WHERE username LIKE '%?%'
嗯??這不是有佔位符嗎??為什麼呢??想了想。。。。。嗯!!明白了這個"?"
號寫在單引號裡面的。所以這個"?"
被當成值處理了!!!
那還有什麼辦法呢??
試試這個!!
SELECT * FROM user WHERE username LIKE '%'+#{likeUser}+'%'
拼起來不就行咯。哈哈!!完美!!
咳!!各位讀者啊,我想問一下。這個真的可以執行嗎??
好!再試試!!
嗯。傳送sql語句正常!!不錯不錯。
Preparing: SELECT * FROM user WHERE username LIKE '%'+?+'%'
嗯??還報錯!!!
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;
*_*
,MySQL。你逗我吧!!我這個有語法錯誤??我用"+"
號拼接字串還有錯??你有病吧!!MySQL!!MD!!*_*
不跟你玩了,快告訴我正確答案!!
其實很多程式設計師都犯這個錯!!錯了還不知道到底錯在哪兒??
在MySQL中"+"
號是被重寫了的,它對於字串來說並沒有拼接的功能,反而只對數字有正常的加法功能!!!
所以啊!你還記得concat()這個方法不??
在MySQL中的用法:
concat('hello ','FireLang')//輸出hello FireLang
所以我們可以這樣寫MyBatis的sql程式碼:
SELECT * FROM user WHERE username LIKE concat('%',#{username},'%')
好了正確答案告訴你了!!
表個態吧!!感覺我這篇文章怎麼樣???請點贊吧!!!