天天看點

【轉載】Ibatis (井号)# (美元符号)$ 差別

Ibatis (井号)# (美元符号)$ 差別

1、#可以進行預編譯,進行類型比對,#變量名#? 會轉化為 jdbc的?類型

$不進行資料類型比對,$變量名$就直接把$name$替換為 name的内容

例如:

select * from tablename where id = #id#,假設id的值為12,其中如果資料庫字段id為字元型,那麼#id#表示的就是'12',如果id為整型,那麼#id#就是 12

??? 會轉化為jdbc的select * from tablename where id=?,把?參數設定為id的值

????select * from tablename where id = $id$,如果字段id為整型,Sql語句就不會出錯,但是如果字段id為字元型,

????那麼Sql語句應該寫成 select * from table where id = '$id$'

????

3、#方式能夠很大程度防止sql注入.

4、$方式無法方式sql注入.

5、$方式一般用于傳入資料庫對象.例如傳入表名.

6、是以ibatis用#比$好,一般能用#的就别用$.

另外,使用##可以指定參數對應資料庫的類型

如:

select * from tablename where id =#id:number#?

在做in,like 操作時候要特别注意

mysql: select * from user where user_name like concat('%',#name#,'%')oracle: select * from user where user_name like '%'||#name#||'%'sql server: select * from user where user_name like '%'+#name#+'%'

--------------------------------------------------------------------------------------

昨天一個項目中在寫ibatis中的sql語句時,order by #field#, 運作時總是報錯,後來上網查了查,才知道這裡不該用#,而應該用$,随即查了下#與$的差別.

總結如下:

1.#是把傳入的資料當作字元串,如#field#傳入的是id,則sql語句生成是這樣,order by "id",這當然會報錯..

2.$傳入的資料直接生成在sql裡,如#field#傳入的是id,則sql語句生成是這樣,order by id, 這就對了.

3.#方式能夠很大程度防止sql注入.

4.$方式無法方式sql注入.

5.$方式一般用于傳入資料庫對象.例如傳入表名.

6.一般能用#的就别用$.

就這麼多了.