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