JDBC——CreateStatement和PrepareStatement做用區別

  本文主要講了PrepareStatement和CreateStatement的做用區別,你們能夠一塊兒學習!走後端的小夥伴都會必修JDBC,在前段時間做者實訓期間,看到老師舉例的時候用了CreateStatement(固然老師只是隨便舉得例子)。而本人的我的習慣是用PrepareStatement的,做者以前是很困惑過這兩個之間的區別的,在實踐以後以及看的一些資料積攢了一些見解,在這裏和你們談一下CreatStatement和PrepareStatement的做用和區別吧。(圖爲老師的案例)sql

  做用:這二者做用基本同樣,來看二者代碼的寫法。二者在JDBC鏈接數據庫時用法基本同樣,都是建立了一個數據庫的操做對象,而後讓該對象調用excuteQuery執行相應的sql語句。因此在JDBC中這倆其實最後達成的效果是同樣的。數據庫

  區別:CreateStatement和PrepareStatement的最明顯的區別首先天然是寫法上面了。來直接看代碼:後端

代碼背景:假設咱們數據庫裏面有一張關於book的表,裏面有bid和bname兩列,如今進行查詢兩列數據這個簡單的操做。安全

這是用PrepareStatement建立的ps操做對象的過程(爲了加強對比性其他片斷先省略掉)學習

//建立sql命令 String sql="select *from book where bid=? and bname=?"; //建立sql操做對象 ps=conn.prepareStatement; //給佔位值賦值 ps.setString(1,bid); ps.setString(2,bname); //執行sql命令 rs=ps.executeQuery();

  這是用CreatStatement建立的st操做對象的過程spa

//建立sql命令 String sql="select *from book where bid='"+bid+"' and bname='"+bname"'"; //建立數據庫操做對象 st=conn.createStatement; //執行sql命令 rs=st.executeQuery(sql);

  從代碼上相信不少人就能夠看出兩我的寫法上的區別了,PrepareStatement和CreateStatement的寫法就是前者將sql語句中的變量抽離出來了。你品,你細品。有沒有從這發現PrepareStatement的一大優勢:可讀性強!什麼?你沒有發現?若是咱們原來數據庫中的book表多了bdescn,bprice,bauthor這三列。咱們往這五列添加數據,兩個代碼的樣子又變成什麼樣子了呢?rest

  Createment的是這樣的:code

String sql = "insert into book (bid,bname,bauthor,bdescn,bprice) values("+var1+'"+var2+"',"+var3+",'"+var4+","+var5+"')";
st = conn.createStatement();
rs = st.executeUpdate(sql);

  PrepareStatement是這樣的對象

String sql = "insert into book (boid,bname,bauthor,bdescn,bprice) values(?,?,?,?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1,var1);
ps.setString(2,var2);
ps.setString(3,var3);
ps.setString(4,var4);
ps.setString(5,var5); pst.executeUpdate();

  這樣看應該是很是清晰了吧,CreateStatement在寫的時候要注意的太多了,並且標點符號啥的一點都不能錯。不然程序就會報錯,這誰頂得住呀!blog

  固然不止這一個區別。PrepareStatement從「倫理」上面來講應該是誕生於CresteStatement,也就是CreateStatement是它爸!!因此CreateStatement上面的全部優勢都被PrepareStatement完美的繼承了。就拿上面的舉例,實際上Createment的工做原理就是將String sql="insert into book values()"執行了屢次,而PrepareStatement工做原理則相反,是先將相應的sql語句編譯好,以後有對象執行這條sql語句時,直接調用相應編譯好的sql語句時就好。因此後者的工做效率就會明顯的比前者高,固然也就更加靈活啦。

  最後,就是最重要的一個區別了。那就是PrepareStatement的安全性比「他爸」高了很是多,你在看上面的代碼,你品,你細品。若是看不出來的話我給你們換一個,若是使用CreateStatement創造數據庫操做對象去驗證用戶的帳號密碼的時是否是下面這麼操做的呢?

String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";

st = conn.createStatement();

rs = st.executeUpdate(sql);

  有沒有感受有什麼不對的地方呢??你看,假使咱們在知道一個用戶的用戶名殊不知道密碼的時候,將or '1' = '1'看成密碼傳進去會發生什麼呢?句子就變成這樣子了select * from user where username = 'user' and userpwd = '' or '1' = '1'是否是就會驚奇的發現,這居然是一個恆等式!!因此想要獲得你的權限去幹事情就變得很是簡單,好比添加一個在'or '1' = 1'添加一個drop table book是否是你這一個表就消失了呢?而用它的「兒子」就徹底不會出現這種狀況,由於PrepareStatement在運行的過程當中都是獨立的,數據也都是獨立運行的,因此影響沒有那麼大的!

  好啦,就講到這了,但願能夠給你一點幫助!

相關文章
相關標籤/搜索