第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

關(guān)于mybaties中#和$的區(qū)別?

關(guān)于mybaties中#和$的區(qū)別?

mybaties中#和$的區(qū)別
查看完整描述

4 回答

?
月關(guān)寶盒

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊

首先通過下面兩條sql及打印的執(zhí)行sql,清楚明了的看一下它們的區(qū)別:
<select id="selectUserInfo" parameterType="java.util.Map" resultType="java.util.Map">
select
*
from
user
where
userId=${id} password=#{pwd}
</select>12345678

假設(shè)入?yún)魅氲氖?,打印執(zhí)行sql如下:
Preparing:select * from user where id=1 and password=111111
<select id="selectUserInfo" parameterType="java.util.Map" resultType="java.util.Map">
select
*
from
user
where
userId=#{id} and password=#{pwd}
</select>12345678

同樣入?yún)魅?,打印的執(zhí)行sql如下:
Preparing:select * from user where id=? and password=?
Parameters:1(String),111111(String)
MyBatis啟用了預(yù)編譯功能,在SQL執(zhí)行前,會先將上面的SQL發(fā)送給數(shù)據(jù)庫進(jìn)行編譯;執(zhí)行時(shí),如果入?yún)?{}格式的,將入?yún)⑻鎿Q編譯好的sql中的占位符“?”;如果入?yún)⒏袷綖?{},則直接使用編譯好的SQL就可以了。因?yàn)镾QL注入只能對編譯過程起作用,所以使用#{}入?yún)⒌姆绞娇梢院芎玫乇苊饬薙QL注入的問題。
mybatis預(yù)編譯底層實(shí)現(xiàn)原理
MyBatis是如何做到SQL預(yù)編譯的呢?其實(shí)在框架底層,是JDBC中的PreparedStatement類在起作用,PreparedStatement是我們很熟悉的Statement的子類,它的對象包含了編譯好的SQL語句。這種“準(zhǔn)備好”的方式不僅能提高安全性,而且在多次執(zhí)行同一個(gè)SQL時(shí),能夠提高效率。原因是SQL已編譯好,再次執(zhí)行時(shí)無需再編譯。
總結(jié)
#{}:相當(dāng)于JDBC中的PreparedStatement
${}:是輸出變量的值
簡單說,#{}是經(jīng)過預(yù)編譯的,是安全的;${}是未經(jīng)過預(yù)編譯的,僅僅是取變量的值,是非安全的,存在SQL注入。
番外(sql注入)
還是以上面的兩條sql為例,入?yún)d的值傳入“1 or userId=2”,入?yún)wd的值傳入“111111”。以#{}格式傳入入?yún)⒑蟮膱?zhí)行sql:
select * from user where userId=”1 or userId=2” and password = “111111”;
以${}格式傳入入?yún)⒑蟮膱?zhí)行sql:
select * from user where userId=1 or userId=2 and password = 111111;
很顯然,以${}格式傳入入?yún)⒑蟮膱?zhí)行sql打亂了我們的預(yù)期sql格式及查詢條件,從而實(shí)現(xiàn)sql注入。所以,除了order by 等需要傳入數(shù)據(jù)庫字段等的入?yún)⑹褂?{},其他的盡量使用#{}。

查看完整回答
反對 回復(fù) 2019-09-14
?
Smart貓小萌

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊

如果你學(xué)過jdbc編程,就知道java提供了2種statement,一種是拼寫式sql語句的statement,這種方式對應(yīng)你說的$,并且可以輕松的注入攻擊;另一種是preparestatement,這種是預(yù)編譯的statement,因?yàn)轭A(yù)編譯,執(zhí)行效率要更高,并且由于其拼寫sql只能用?代替(即字符不需要帶“ ' ”單引號,)它會自動的幫你根據(jù)數(shù)據(jù)類型加上單引號或不加,所以,使用此方式拼寫sql語句不容易被注入攻擊(或者根本不會),這就是對于你說的#。

查看完整回答
反對 回復(fù) 2019-09-14
?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

mybatis預(yù)編譯底層實(shí)現(xiàn)原理
MyBatis是如何做到SQL預(yù)編譯的呢?其實(shí)在框架底層,是JDBC中的PreparedStatement類在起作用,PreparedStatement是我們很熟悉的Statement的子類,它的對象包含了編譯好的SQL語句。這種“準(zhǔn)備好”的方式不僅能提高安全性,而且在多次執(zhí)行同一個(gè)SQL時(shí),能夠提高效率。原因是SQL已編譯好,再次執(zhí)行時(shí)無需再編譯。
總結(jié)
#{}:相當(dāng)于JDBC中的PreparedStatement
${}:是輸出變量的值
簡單說,#{}是經(jīng)過預(yù)編譯的,是安全的;${}是未經(jīng)過預(yù)編譯的,僅僅是取變量的值,是非安全的,存在SQL注入。



查看完整回答
反對 回復(fù) 2019-09-14
  • 4 回答
  • 0 關(guān)注
  • 1248 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號