国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
淺談 JDBC 中 CreateStatement 和 PrepareStatement 的區(qū)別與優(yōu)劣。

本人的幾點(diǎn)淺見,各位大大不喜勿噴。

先說(shuō)下這倆到底是干啥的吧。其實(shí)這倆干的活兒都一樣,就是創(chuàng)建了一個(gè)對(duì)象然后去通過(guò)對(duì)象調(diào)用executeQuery方法來(lái)執(zhí)行sql語(yǔ)句。說(shuō)是CreateStatement和PrepareStatement的區(qū)別,但其實(shí)說(shuō)的就是Statement和PrepareStatement的區(qū)別,相信大家在網(wǎng)上已經(jīng)看到過(guò)不少這方面的資料和博客,我在此處提幾點(diǎn),大家看到過(guò)的,就當(dāng)重記憶,沒(méi)看到就當(dāng)補(bǔ)充~下面開始談?wù)勊麄兊膮^(qū)別。

最明顯的區(qū)別,就是執(zhí)行的sql語(yǔ)句格式不同。我們往上放兩段代碼來(lái)看看他們的區(qū)別把:

代碼背景:我們有一個(gè)數(shù)據(jù)庫(kù),里面有一個(gè)user表,有username,userpwd兩列。我們要查出這兩列的數(shù)據(jù)。

這是使用CreateStatement方法創(chuàng)建了stmt對(duì)象,再通過(guò)他查詢的一部分語(yǔ)句片段。

  1. String sql = "select * from users where username= '"+username+"' and userpwd='"+userpwd+"'";
  2. stmt = conn.createStatement();
  3. rs = stmt.executeQuery(sql);
而下面則是使用了PrepareStatement方法創(chuàng)建了pstmt對(duì)象,再通過(guò)這個(gè)對(duì)象查詢的一部分語(yǔ)句片段。
  1. String sql = "select * from users where  username=? and userpwd=?";
  2. pstmt = conn.prepareStatement(sql);
  3. pstmt.setString(1, username);
  4. pstmt.setString(2, userpwd);
  5. rs = pstmt.executeQuery();

相信寫到這,大家很多人就能看出來(lái)了,原來(lái)PrepareStatement跟Statement的主要區(qū)別就是把上面sql語(yǔ)句中的變量抽出來(lái)了。這就是我要說(shuō)的第一大優(yōu)點(diǎn),PrepareStatement可以提高代碼的可讀性。什么?你沒(méi)覺(jué)得這有什么可以提高可讀性的?那好,咱來(lái)看看下面這兩段代碼,看完你再說(shuō)話。

代碼背景:我們有一個(gè)數(shù)據(jù)庫(kù),里面有一個(gè)book表,有bookid,bookname,bookauthor,booksort,bookprice五列。我們要向這個(gè)表中添加一部分?jǐn)?shù)據(jù)。

Statement版

  1. String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values ('"+var1+"',
  2. '"+var2+"',"+var3+",'"+var4+","+var5+"')";
  3. stmt = conn.createStatement();
  4. rs = stmt.executeUpdate(sql);

ParperStatement版

  1. String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values (?,?,?,?,?)";
  2. pstmt = conn.prepareStatement(sql);
  3. pstmt.setString(1,var1);
  4. pstmt.setString(2,var2);
  5. pstmt.setString(3,var3);
  6. pstmt.setString(4,var4);
  7. pstmt.setString(5,var5);
  8. pstmt.executeUpdate();
怎么樣。反正我打這行代碼的時(shí)候,整個(gè)引號(hào)逗號(hào)就給我刺激懵了。

下面說(shuō)說(shuō)第二點(diǎn)優(yōu)點(diǎn)。ParperStatement提高了代碼的靈活性和執(zhí)行效率。

PrepareStatement接口是Statement接口的子接口,他繼承了Statement接口的所有功能。它主要是拿來(lái)解決我們使用Statement對(duì)象多次執(zhí)行同一個(gè)SQL語(yǔ)句的效率問(wèn)題的。ParperStatement接口的機(jī)制是在數(shù)據(jù)庫(kù)支持預(yù)編譯的情況下預(yù)先將SQL語(yǔ)句編譯,當(dāng)多次執(zhí)行這條SQL語(yǔ)句時(shí),可以直接執(zhí)行編譯好的SQL語(yǔ)句,這樣就大大提高了程序的靈活性和執(zhí)行效率。

最后但也是最重要的一個(gè)大大的比Statement好的優(yōu)點(diǎn),那就是安全!

你說(shuō)啥?這還關(guān)安全啥事兒,那我給你一行代碼,你來(lái)給我說(shuō)說(shuō)這是干嘛的。

  1. String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
  2. stmt = conn.createStatement();
  3. rs = stmt.executeUpdate(sql);
這是驗(yàn)證用戶名密碼的,對(duì)吧。但要是我們把'or '1' = 1'當(dāng)作密碼傳進(jìn)去,你猜猜會(huì)發(fā)生啥。
select * from user where username = 'user' and userpwd = '' or '1' = '1';
發(fā)現(xiàn)了吧!這是個(gè)永真式,因?yàn)?永遠(yuǎn)等于1。所以不管怎樣都能獲取到權(quán)限。哇。這就壞咯!這還不是最壞的,你再看!
  1. String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
  2. stmt = conn.createStatement();
  3. rs = stmt.executeUpdate(sql);
依舊是這行代碼。這次我們把'or '1' = 1';drop table book;當(dāng)成密碼傳進(jìn)去。哇!又壞了!這次直接把表給刪了。但是,你如果用PrepareStatement的話就不會(huì)出現(xiàn)這種問(wèn)題。你傳入的這些數(shù)據(jù)根本不會(huì)跟原來(lái)的數(shù)據(jù)有任何的交集,也不會(huì)發(fā)生這些問(wèn)題。

文章寫到這就結(jié)束了。hope can help~

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Statement,PreparedStatement區(qū)別 - pan_java - Ja...
PrepareStatment 與 Statement 比較
關(guān)于 Java Database Connectivity 您不知道的 5 件事
JDBC加強(qiáng)
用JAVA從數(shù)據(jù)庫(kù)中讀出字段及內(nèi)容
請(qǐng)教JDBC怎么連接ORACLE數(shù)據(jù)庫(kù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服