隨著開發團隊轉投Google Code旗下,ibatis3.x正式更名為Mybatis
我在開發過程中,我主要是喜歡mybatis可以讓開發者靈活的編寫sql語句。其中動態變量算是用的最多的了。
mybatis支持兩種動態的往sql語句中嵌入變量的方式,一種是用#,另一種是$。
#appId#,使用#,是使用預編譯處理,mybatis會先用?占位(等同于PRepareStatement),再傳給配置的數據庫進行處理。數據庫處理時,會根據變量的類型,進行值替換。如果是VARCHAR,就會加上引號,這樣可以很好的防止sql注入。
$appid$,使用$,mybatis會直接進行值替換,變量類型不影響。如果需要匹配的是字符串,那么編寫的sql語句就需要手動的加上引號,比如 '$appid$',一些其他的函數也是類似的。一般只有在需要傳入表名、列名這些數據庫保留字段時,才會使用$$。因為是直接值替換,所以使用$是不安全的。假如在一個登陸場景下,開發者沒有手動加引號,用戶在密碼輸入框輸入 or 1=1 ,直接進行值替換,最后的sql語句可能就是 username = 'username' or 1=1 ,這樣,會找出所有的用戶信息。
mybatis只是做了sql替換,比如使用#就等同于prepareStatement,使用$就相當于開發者直接寫好了sql。真正做處理的還是數據庫服務器。比如預編譯,數據庫會在緩存中保留傳進來的預編譯,當下次有相同結構的sql請求執行時,數據庫就可以更快的進行處理。
新聞熱點
疑難解答