最明显的区别,就是执行的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语句中的变量抽出来了。
PrepareStatement较Statement有三大优点
优点一、增加代码可读性
优点二、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。所以不管怎样都能登录成功。