mybatis剛從@Annotation向xml轉換時遇到的一些坑
-
老碰到少了逗號“,”的情況,導致sql出錯,但是這類問題又不容易察覺到,幸好如果有異常堆疊打出的話,這類問題還是比較好發現的。比較麻煩的事是在某廠,當時碰到的這個服務本地無法啟動,但是本人初來乍到,一是不熟悉整個系統,找不到啟動失敗原因在哪兒,而且據說這個問題對於團隊老人們都比較難解決,專案又忙,暫時只能通過部署在遠端伺服器上測試了,二是專案工期壓力大,deadline近在眼前,沒有時間解決本地啟動問題,這類xml又無法遠端debug的時候進行熱部署,所以每次錯一次就得花好久部署一次,極大拖慢研發速度,消耗本猿的耐心,可以說本文極大出生的極大原因是因為這個小小的逗號。可以說這個問題當時除了每次寫完在提交的時候細細的查一遍更新的SQL有沒有少逗號外,無解。(更新:其實可以通過SqlSessionFactory重新載入mapper.xml檔案)
-
<set>的使用錯誤,在組合使用<set> + <if>的時候,由於語法不熟,專案又忙,沒有時間先學習一下mybatis xml的語法,以為用過註解寫個xml還是沒問題的,所以這個地方在<set>標籤裡面一些屬性正常更新,一些屬性需要if判斷來更新的時候碰到的坑,還有一個逗號“,”問題,預設<set>標籤是會自動去除末尾逗號的,如下:
<update id="update" > update user <set> modify_time = now(), //set標籤裡面就不用再寫set了,需要判斷就加if,不需要就直接這麼寫即可,<set>標籤等同於set,一個sql語句只能寫一個,所有更新語句全部寫在<set>標籤裡 modifier = #{modifier}, //這個地方就算下面沒有更新項了,逗號也會預設去掉,不會影響,如果沒有這個逗號,下面還有條件生效時,兩個賦值語句中間就會缺少逗號 <if test="name != null"> name=#{name}, </if> <if test="idCard != null"> id_card=#{idCard}, </if> </set> WHERE is_deleted = 0 </update>
-
在寫大於小於(
>
,<
,>=
,<=
)符號時,由於這些符號是特殊字元(很明顯系統可能會判斷錯誤為xml的標籤開頭),在解析xml檔案時會被轉義,為了不讓它們被轉義,我們用<![CDATA[ 文字內容]]>
來包上這部分語句,CDATA 全名:character data,所有 XML 文件中的文字均會被解析器解析,除了 CDATA 區段(CDATA section)中的文字會被解析器忽略。
終其所有,都是因為在開幹之前沒有好好的研讀一下xml的語法,這裡後知後覺,並附上一份比較好的xml語法地址:
mybatis語法