佔位符:
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方法,如果...