乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       liang1234_ 2019-03-12

      本人的幾點淺見,各位大大不喜勿噴。

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

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

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

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

      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對象,再通過這個對象查詢的一部分語句片段。
      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();

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

      代碼背景:我們有一個數(shù)據(jù)庫,里面有一個book表,有bookid,bookname,bookauthor,booksort,bookprice五列。我們要向這個表中添加一部分?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();
      怎么樣。反正我打這行代碼的時候,整個引號逗號就給我刺激懵了。

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

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

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

      你說啥?這還關(guā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'當(dāng)作密碼傳進(jìn)去,你猜猜會發(fā)生啥。
      select * from user where username = 'user' and userpwd = '' or '1' = '1';
      
      
      發(fā)現(xiàn)了吧!這是個永真式,因為1永遠(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的話就不會出現(xiàn)這種問題。你傳入的這些數(shù)據(jù)根本不會跟原來的數(shù)據(jù)有任何的交集,也不會發(fā)生這些問題。
      
      

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

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多