Mybatis系列 和 有什麼區別?

2021-10-23 19:01:01 字數 1532 閱讀 3799

當我們在應用變數的時候預設使用#{},如下: 

select * from user where id = #;

select * from user where id = $;

通過上面的例子好像並沒有看出他們之間有什麼區別

新增日誌依賴:

org.slf4j

slf4j-api

1.7.5

org.slf4j

slf4j-log4j12

1.7.5

在resources目錄下,新增log4j.properties 

log4j.rootlogger=debug,stdout

log4j.logger.org.mybatis=debug

先看通過${}執行的日誌:

從上面的日誌中可以看出,${}是乙個純粹的string 替換,在動態sql解析階段會進行變數替換

sql直接拼接就好了,parameters為空

看#{}執行的日誌

解析為乙個jdbc的預編譯語句的引數標記符

#{}是佔位符的方式來解決引數傳遞問題,變數的替換是在dbms中,而且替換會自動加單引號   『』

${}是引數拼接的問題,變數的替換是在動態sql解析階段,但是引數拼接可能會存在sql注入的 

1.能用#{}的地方就用#{},因為${}存在sql注入非常的不安全,可能一條查詢語句就能變成刪表操作

例如: 

select * from $ where name=#

這個時候我們傳遞tablename 為 user;delete user; --

sql預編譯之後變成:

select * from user; delete user; -- where name = ?;

2.表明作為變數的時候,必須使用${}知道為什麼嗎?這是由於如果我們使用#{}佔位符傳遞的話會自動加上單引號『』,但是${}不會自動加單引號

select * from # where name = #;
預編譯之後變成

select * from ? where name = ?;
假設我們傳入的tablename=user name="zhangsan"

select * from 'user' where name='zhangsan';
上述sql語句是錯誤的,表名不能加單引號

在上面的介紹中提到了很多次的sql預編譯,sql預編譯就是在資料庫驅動在傳送sql語句和引數給dbms之前對sql語句進行編譯,這樣dbms在執行sql語句就不需要重新編譯

Mybatis中 和 有什麼區別

一般說來,二者的區別可總結為以下6點 1 將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。如 order by user id 如果傳入的值是111,那麼解析成sql時的值為order by 111 如果傳入的值是id,則解析成的sql為order by id 2 將傳入的資料直接顯示生...

mybatis中 跟 有什麼區別

動態 sql 是 mybatis 的強大特性之一,mybatis 在對 sql 語句預編譯前,會對 sql 進行動態解析,解析為乙個 boundsql 物件,在動態 sql 解析階段,和 的不同 可以防止sql注入.先把sql中使用 的地方變成?佔位符,再設定引數值 insert into stud...

MyBatis中 與 有什麼區別

1 是預編譯處理,mybatis在處理 時,它會將sql中的 替換為?然後呼叫preparedstatement的set方法來賦值 2 是 字元 串替換,myba tis在 處理 是字串替換,mybatis在處理 是字串替換 myb atis 在處理時,它會將sql中的 替換為變數的值。注意 使用 ...