sql 中 和 的區別

2021-08-26 18:03:58 字數 1393 閱讀 6761

專案開發過程中,在mybaitis框架中經常sql需要動態賦值,會出現# 、$兩種形式。

接下來,我們一起來看乙個案例:根據使用者的姓名來篩選使用者資訊,其中使用者姓名不確定,是動態變化的,sql如下:

select * from userinfo  where user_name=「張三」; //查詢名稱是張三的資訊

在xml中 ,select * from userinfo  where user_name=# //根據名稱動態查詢使用者資訊,#將引數解析成字串

或者:select * from userinfo  where user_name=『$'  //$會將引數解析成物件 需要加上引號引住

一、主要區別如下:

1、#將傳入的引數都當成乙個字串,會對自動傳入的資料加乙個雙引號。如:order by #,如果傳入的值是18,那麼解析成sql時的值為order by "18", 如果傳入 age ,則會解析為 order by  "age"

2、 $將傳入的引數直接顯示生成在sql中,被當成乙個物件。如:order by$,如果傳入的值是18,那麼解析成sql時的值為order by 18,  如果傳入的值是age,則解析成的sql為order by age

3、#方式底層採用預編譯方式preparedstatement,能夠很大程度防止sql注入;$方式底層只是statement,無法防止sql注入。

4、$方式一般用於傳入資料庫物件,例如傳入表名.

5、一般能用#的就別用$  注意點:mybatis排序時使用order by 動態引數時需要注意,用$而不是#

二、sql預編譯

1. 定義:

指資料庫驅動在傳送 sql 語句和引數給 dbms 之前對 sql 語句進行編譯,這樣 dbms 執行 sql 時,就不需要重新編譯。

2. 為什麼需要預編譯

jdbc 中使用物件 preparedstatement 來抽象預編譯語句,使用預編譯。預編譯階段可以優化 sql 的執行。預編譯之後的 sql 多數情況下可以直接執行,dbms 不需要再次編譯,越複雜的sql,編譯的複雜度將越大,預編譯階段可以合併多次操作為乙個操作。預編譯語句物件可以重複利用。把乙個 sql 預編譯後產生的 preparedstatement 物件快取下來,下次對於同乙個sql,可以直接使用這個快取的 preparedstate 物件。mybatis 預設情況下,將對所有的 sql 進行預編譯。

案例:動態模糊查詢

xml :    

select * from c_product_info 

where state=1 and (product_name like '%$%'

or key_words_list like '%$%'

or product_brand like '%$%')

註解:@select(,'%')"  

})

sql 中 和 的區別

將傳入的資料直接顯示生成在sql中,那麼我們使用 的時候 select from user where name 在動態解析的時候,會將我們傳入的引數當做string字串填充到我們的語句中,就會變成下面的語句 select from user where name dato 預編譯之前的 sql 語...

sql中 和 的區別

font size 18px delete from ups role permission dataparams where role id 在這裡用到了 使用 時 1 用來傳入引數,sql在解析的時候會加上 當成字串來解析 如這裡 role id roleid 2 能夠很大程度上防止sql注入 ...

sql 中 和 的區別

在sql中對於傳入引數有兩種寫法,剛開始學的時候總是不知道是什麼原因,故此寫下此筆記作為解釋 將傳入的資料直接顯示生成在sql中,那麼我們使用 的時候 select from user where name 在動態解析的時候,會將我們傳入的引數當做string字串填充到我們的語句中,就會變成下面的語...