MySQL中的空字符串長(zhǎng)度和MyBatis中的處理有時(shí)會(huì)讓人困惑,本文將介紹兩者之間的關(guān)系以及解決方案。
在MySQL中,空字符串''是一個(gè)合法的值,它表示一個(gè)長(zhǎng)度為0的字符串。因此,使用SELECT LENGTH('')
查詢得到的結(jié)果是0。
mysql> SELECT LENGTH('');
+----------+
| LENGTH('') |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
但是在MyBatis中,如果傳入的參數(shù)是一個(gè)空字符串,則使用#{param}
會(huì)自動(dòng)將它轉(zhuǎn)換為null。因此,如果我們?cè)贛apper中定義了一個(gè)查詢語(yǔ)句:
<select id="queryByName" resultType="User">
SELECT * FROM user WHERE name = #{name}
</select>
并且使用一個(gè)空字符串調(diào)用它:
User user = userDao.queryByName("");
MyBatis會(huì)將這個(gè)語(yǔ)句轉(zhuǎn)換為:
SELECT * FROM user WHERE name = NULL
這是錯(cuò)誤的,因?yàn)镹ULL和空字符串是兩個(gè)不同的概念。
為了解決這個(gè)問題,我們需要對(duì)Mapper進(jìn)行修改,使用<if>
標(biāo)簽判斷參數(shù)的值是否為null或空字符串,如果是空字符串,則手動(dòng)將它轉(zhuǎn)換為一個(gè)長(zhǎng)度為0的字符串。例如:
<select id="queryByName" resultType="User">
SELECT * FROM user WHERE name = #{name, jdbcType=VARCHAR}
</select>
<!-- ...
-->
<select id="queryByName" resultType="User">
SELECT * FROM user WHERE name =
<if test="name == null or name.trim().length() == 0">
''
<else>
#{name}
</if>
</select>
這樣就可以保證MySQL中空字符串的長(zhǎng)度為0,而不會(huì)與null混淆。