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