最明顯的區別,就是執行的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、增長代碼可讀性對象
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。因此無論怎樣都能登陸成功。編譯