mybatis拼接符和佔位符的區別

2021-08-22 08:19:18 字數 1764 閱讀 2063

佔位符:

1.#{}佔位符可以用來設定引數,如果傳進來的是基本型別,也就是(string,long,double,int,boolean,float等),那麼#{}裡面的變數名可以隨意寫,什麼abc,***等等,這個名字和傳進來的引數名可以不一致。

2.如果傳進來的是pojo型別,那麼#{}中的變數名必須是pojo的屬性名,可以寫成屬性名,也可以寫屬性名.屬性名。

拼接符:

3.注意:#{}佔位符不能解決三類問題

動態表名不可以用#{} :select * from # 

動態列名不可以用#{} : select # from table 

動態排序列不可以用#{} : select * from table order by #

2.${}拼接符

1.如果傳進來的是基本型別,也就是(string,long,double,int,boolean,float等),那麼#{}裡面的變數名必須寫value。

delete from student where id=$

2.如果傳進來的是pojo型別,那麼#{}中的變數名必須是pojo的屬性名,可以寫成屬性名,也可以寫屬性名.屬性名。但是由於是拼接的方式,對於字串我們需要自己加引號

insert into student(name,age,score) values('$',$,$)

與上面一樣,不能將類名寫進來:

insert into student(name,age,score) values('$',$,$)

3.${}佔位符是字串連線符,可以用來動態設定表名,列名,排序名

動態表名 :select * from table動態列名:selecttable動態列名:select from table 

動態排序 : select * from table order by column4.column4.{}可以作為連線符使用,但是這樣的方式是不安全的,很容易發生sql注入問題,sql注入問題可以參考

select id,name,age,score from student where name like '%$%'

3.#{}與${}區別

能使用#{}的時候盡量使用#{},不使用${}

#{}相當於jdbc中的preparedstatement(預編譯),${}是直接使用裡面的值進行拼接,如果解釋預編譯和直接拼接,我想可以這麼理解預編譯:比如將乙個#傳進來,預編譯是先將sql語句編譯成為模板,也就是我知道你要幹什麼,假設這個sql是要查詢名字為***的學生資訊,那無論這個***裡面是什麼資訊,我都只會去根據名字這一列查詢,裡面無論寫的是什麼,都只會當做乙個字串,這個型別在預編譯的時候已經定義好了。

${}就不一樣,是將語句拼接之後才確定查詢條件/型別的,那麼就會有被注入的可能性,有些人故意將名字設定為刪除條件,這時候sql就變成刪除操作了。

所以我們一般類似模糊查詢都是用#{}拼接

select id,name,age,score from student where name like '%' # '%'

但是對於order by 我們是用不了#{}的,因為用了這個就會被自動轉換成字串,自動加引號,這樣語句就不生效了。

select id,name,age,score from student order by #

select * from table order by 'column'

那我們需要怎麼處理呢?我們只能使用${},mybatis不會修改或轉義字串。這樣是不安全的,會導致潛在的sql注入攻擊,我們需要自己限制,不允許使用者輸入這些字段,或者通常自行轉義並檢查。所以這必須過濾輸入的內容。

mybatis的 佔位符和 拼接符的區別

佔位符 佔位 如果傳入的是基本型別,那麼 中的變數名稱可以隨意寫 如果傳入的引數是pojo型別,那麼 中的變數名稱必須是pojo中的屬性.屬性.屬性 拼接符 字串原樣拼接 如果傳入的是基本型別,那麼 中的變數名必須是value 如果傳入的引數是pojo型別,那麼 中的變數名稱必須是pojo中的屬性....

Mybatis佔位符 與佔位符 區別

速度快,能防止sql注入,是佔位符方式,先預編譯,然後填充引數,字串格式,使用者名稱 引數只是下劃線上的內容 是直接拼接到語句上,這種方式需要自己拼括號和引數,但是也可以拼接想執行的任何語句,也就是傳說中的sql注入 詳情如下 在mybatis中使用引數進行sql拼裝經常會使用到 和 兩種引數的設定...

mybatis 之 佔位符 和

佔位符用來設定引數,引數的型別可以有3種,基本型別,自定義型別,map基本型別作為引數,引數與佔位符中的名稱無關。select from t role where id 測試 test public void testselectone 自定義型別作為引數,自定義類中需要為為屬性提供get方法,如果...