mybatis sql使用及Oracle模糊查詢

1.第一個問題

sql在數據庫能查到但是,執行時就是什麼都沒有,網上查了下,解決辦法,可能可數據庫數據類型有關,如果是char(10)長度爲10的話,可能不足10個都用空格補位了,所以這個時候要加trim()函數去空格,因爲

但我加上並沒有什麼用,而且我數據庫類型varchar可變長度

 

這個是用postman的請求

這個是查詢結果,但當時這個參數是'37',查詢結果totel = 0

xml地方去掉參數直接查詢就正常了,由此判斷是還是傳參問題,但註解傳參也沒發現有什麼問題

xml頁面用#進行接收

最後看了下sql編譯結果發現 select * from table where provCode = ''37''

是這個條件去查的,不是雙引號,而是嵌套了兩個單引號,那麼匹配條件自然沒有裏面於''單引號的.

解決辦法,其實是個失誤,

postman拼接參數不加''單引號即可,笑哭

在就是可以使用${value} 來進行接收 ,${value} 不會自動加''號

再就是記錄一些小規範 ,#和{之間不能有空格

 

不能寫分號結束,會報無效的字符

 

再就是一個模糊查詢的問題,首先說下兩種接收參數區別

#{} 會在 變量外側 加上 單引號

${} 並不會

但我們應儘量避免使用 ${} ,因爲這個最終會將參數拼接到 sql語句上,存在sql注入的問題。

 兩種辦法

1.使用'%${name}%'  這種方式,但是這種方式並不好,上面說了,有sql注入的風險。

2.我們可以採用 name like concat('%',#{name},'%') 這種方式來進行字符串拼接.

但是以上拼接在oracle中是錯誤的,因爲oracle中concat函數拼接3個要嵌套拼接

concat(concat('aa','bb'),'cc')

或者使用

注意第二種方法後面兩個只限oracle,mysql concat('%',#{name},'%')就可以 了,第一種方法則都可以

 

  1. <!--方法三: 使用 bind 標籤,對字符串進行綁定,然後對綁定後的字符串使用 like 關鍵字進行模糊查詢 -->
  2. <if test="email != null">
  3. <bind name="pattern" value="'%'+email+'%'"/>
  4. and email like #{pattern}
  5. </if>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章