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。因此无论怎样都能登陆成功。编译

相关文章
相关标签/搜索