最明显的区别,就是执行的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。因此无论怎样都能登陆成功。编译