1. 程式人生 > >面試之Mybatis中的$和#區別?

面試之Mybatis中的$和#區別?

Mybatis是如何做到sql預編譯的呢?其實在框架底層,是JDBC中的PreparedStatemen類在起作用,PreparedStatement是我們很熟悉的Statement的子類,它的物件包含了編譯好的sql語句。這種“準備好”的方式不僅能提高安全性,而且在多次執行同一個sql時,能夠提高效率。原因是sql已編譯好,再次執行時無需再編譯。

#{}:相當於jdbc中的PreparedStatement(經過預編譯的,安全的)

①:#將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號(“”);

②:#能夠很大程度防止sql注入

${}:是輸出變數的值(未經過編譯的,僅僅是取變數的值,是非安全的,存在SQL注入)

①:$將傳入的資料直接顯示在生成sql中。

②:$無法防止SQL注入

③:$一般傳入資料庫物件,例如傳入表名。

如以下兩條sql語句:

#{}格式傳入入參

select * from user where userid="1" or userid="2" and password="11111";

${}格式傳入入參

select * from user where userid=1 or userid=2 and password=1111;

以${}傳入入參後的執行sql打亂了我們的預期sql格式及查詢條件,從而實現SQL注入。所以,除了order by 等需要傳入資料庫欄位等入參使用${},其他的儘量使用#{}。