sql中經常用like進行模糊查詢,而模糊查詢就要用到百分號“%”,下劃線“_”這些通配符,其中“%”匹配任意多個字符,“_”匹配單個字符。如果我們想要模糊查詢帶有通配符的字符串,如“60%”,“user_name”,就需要對通配符進行轉義,有兩種方式。如下:
1、反斜槓是轉義符,通過反斜槓來轉義%,使其不再是通配符。這裏第一個%是通配符,第二個%不是通配符。
select percent from score where percent like '%0\%';
2、這種是通過escape關鍵字進行轉義,將特定符號後的字符進行轉義,這裏斜槓後面的%就不再是通配符,斜槓之前的%仍然起通配符作用。
select percent from score where percent like '%0/%' escape '/';
上面的這些事mysql語句的處理,可是如果我們在Java代碼中,如何將傳入的參數處理成上面的形式呢?
比如我們需要查詢name like "我是%強" 這樣的形式:即Mybatis類似這樣"我是%強"需要作爲參數name傳入:
where name like concat('%', #{name}, '%');。
直接將name="我是%強"傳入是不行的,sql語句變成 where name like '%我是%強%'。這樣會找到類似name爲:"我是%強","我是強","我是asdf強"……因爲“%”匹配任意多個字符。
方法一:
所以我們就需要在Java中對"我是%強"中的%進行轉義,轉成:"我是\%強"這樣的形式(即上面的第一點)。
所以Java處理方法如下:
name = "我是%強";
name = name.replaceAll("%", "\\\\%");
沒錯,需要用四個反斜杆去處理,最後獲取到的name就是"我是\%強"。這個在sql中就可以直接使用了。
原理:在java 單獨在字符串中使用"\"轉義字符是會報錯的(除非有特殊含義入:\n,\r)。Java中 "\\" 代表"\", 所以要獲取"\%"這樣的字符串,就需要用兩個反斜杆處理,即"\\%"在Java中表示"\%"。可是,要替換字符串中的%又要用到正則去轉義也需要用"\\%"。因此最終要得到"\%" 就必須要四個"\"。其中經過第一次java轉義獲得"我是\\%強",第二次正則轉義獲得"我是\%強"。
上面是處理%號的,下劃線的處理原理與上面的相同。
方法二:
其實網上也有在Java中結合上面的第二種方法進行處理。即
name = "我是%強";
name = name.replaceAll("%", "/%");
但是這種需要每條用了like的sql語句都添加"escape '/'", 這樣太麻煩了。所以推薦使用方法一的方式進行處理。
關注公衆號獲取更多內容,有問題也可在公衆號提問哦:
強哥叨逼叨
叨逼叨編程、互聯網的見解和新鮮事