CreateStatement 和 PrepareStatement 的優劣

最明顯的區別,就是執行的sql語句格式不一樣。咱們往上放兩段代碼來看看他們的區別把:sql

使用CreateStatement方法建立了stmt對象:數據庫

String sql = "select * from users where  username= '"+username+"' and userpwd='"+userpwd+"'";  
stmt = conn.createStatement();  
rs = stmt.executeQuery(sql);  

使用PrepareStatement方法建立了pstmt對象:安全

String sql = "select * from users where  username=? and userpwd=?";  
pstmt = conn.prepareStatement(sql);  
pstmt.setString(1, username);  
pstmt.setString(2, userpwd);  
rs = pstmt.executeQuery();  

PrepareStatement跟Statement的主要區別就是把上面sql語句中的變量抽出來了。spa

PrepareStatement較Statement有三大優勢code

優勢1、增長代碼可讀性對象

優勢2、ParperStatement提升了代碼的靈活性和執行效率。

PrepareStatement接口是Statement接口的子接口,他繼承了Statement接口的全部功能。它主要是拿來解決咱們使用Statement對象屢次執行同一個SQL語句的效率問題的。ParperStatement接口的機制是在數據庫支持預編譯的狀況下預先將SQL語句編譯,當屢次執行這條SQL語句時,能夠直接執行編譯好的SQL語句,這樣就大大提升了程序的靈活性和執行效率。繼承

優勢三:安全

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

stmt = conn.createStatement();  

rs = stmt.executeUpdate(sql);  

這是驗證用戶名密碼的,但把'or '1' = '1看成密碼傳進去,也就變成了接口

select * from user where username = 'user' and userpwd = '' or '1' = '1';  

這是個永真式,由於1永遠等於1。因此無論怎樣都能登陸成功。編譯

相關文章
相關標籤/搜索