今天在工做中遇到一個問題:在MyBatis的Mapper中增長了一個長度爲1的字符串的判斷,可是程序執行的時候報了類型轉換錯誤異常,很納悶,最後用了兩個小時才找到問題所在,具體狀況是這樣的:java
咱們一般在Mapper中會有動態的判斷,好比判斷某個變量是否爲空或者是否等於特定的一些值,好比:面試
<!-- 判斷空串 --> <if test=" PARAM != '' and PARAM != null"> ...<!-- 若是知足條件將執行的語句 --> </if> <!-- 判斷PARAM的值是否爲字符串HELLO --> <if test=" PARAM == 'HELLO'"> ...<!-- 若是知足條件將執行的語句 --> </if>
咱們都這樣使用的不亦樂乎,也沒有發現什麼不對頭的地方。spring
可是我今天再具體業務中,須要判斷參數是否爲字符串「-」,個人寫法:sql
<if test=" PARAM == '-'"> ...<!-- 若是知足條件將執行的語句 --> </if>
入參的時候PARAM中傳的值爲字符串「test」看上去是沒有問題的,可是程序運行起來,執行這裏的判斷語句的時候,程序報錯,信息以下:數據庫
Caused by: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.NumberFormatException: For input string: "test" ### Cause: java.lang.NumberFormatException: For input string: "test" at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:79) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) at com.sun.proxy.$Proxy93.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:231) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:128) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) at com.sun.proxy.$Proxy126.getKidneyDiseaseFileList(Unknown Source) ... 135 common frames omitted
從報錯信息能夠看出是說類型轉換錯誤,String不能轉換成number。apache
一下是我處理的過程:mybatis
1. 首先,我看到這個信息第一反應還覺得是我把數據庫裏面的這個字段類型設置錯了,把字符串類型設置成了數字類型,可是通過查證,數據庫的字段是varchar(20),不是這個問題。(其實真的是數據庫字段類型不匹配的話,應該是sql執行報錯,應該是sql的語法錯誤,而不是java.lang.NumberFormatException).把焦點彙集在類型轉換上面的時候,就一直在數據庫類型上面徘徊,浪費了一些時間,其實這裏是不該該一直在一個點上反覆停留的。app
2. 以後,我以爲本身搞不定了,就找同事求助,同事也表示看不出來什麼錯誤。可是個人同桌是一位有着三四年工做經驗的老司機,他雖然從面上看不出問題來,可是就開始在代碼裏面試探,逐漸刪除掉一些對於這個問題來講可有可無的代碼,找到問題所在,沒有到5分鐘,老司機說是我sql寫的有問題。老司機的這種解決問題的方法挺值得我學習。學習
3. 老司機由於忙其它任務,就忙去了,我接下來也採起定位的方法找問題所在,最後把問題的焦點,定位在了那條判斷語句上面,由於那個判斷參數是否爲字符串「-」是我後來加上去的,因此我意識到問題就在這裏。可是仍是不知道怎麼錯了。測試
4. 這是旁邊站着一位熱心的同事,在一塊兒看這個問題,他說多是單個字符串,就把它轉換成ASCII編碼了,因此和傳遞進來的字符串進行比較的時候,就須要先轉成數字類型的,因此就報出了這個錯誤。雖然僅僅是一種猜測,可是同事說,把這個「-」換成其它的單個字符應該也會報錯,可是換成長度大於1的字符串就不會報錯了,我修改了一下,進行了測試,果真是這樣。
5. 最後我就從新修改了寫法。問題解決掉了。把橫槓寫成兩個,變成字符串。這樣就不會進行轉換了。或者還有一種寫法,就是把外層用單引號。裏面使用雙引號,這樣我本身通過測試是能夠的。
<!-- 判斷PARAM的值是否爲字符串HELLO --> <if test=' PARAM == "-"'> ...<!-- 若是知足條件將執行的語句 --> </if>
我我的以爲這可能和xml的解析字符串有關,以後須要作一點功課,找一下xml解析方面的資料進一步確認和探究一下。
這個過程當中我本身犯了一個錯誤:找到一點信息,進行了確認以後,還一直停留在這個信息上面,沒有往其它的方面去想。浪費了一些時間。
過程當中學習到的:
1. 問題出現了,若是憑藉已有經驗解決不了問題,甚至連問題出在什麼地方都沒辦法肯定的時候,應該首先肯定問題出現的精確位置。刪減法不失爲一種好的方法;