Statement 和 PrepareStatement二者都是用在获取数据库操作对象;
1当遇到sql注入问题的时候,Statement 不能排查出来, 即* or ‘1’=1 被认定为sql的语句而被编译。
//3选择数据库操作对象
statement=connection.createStatement();
//4执行sql
String sql="select *from t_user where
loginName='"+uesrLoginInfo.get("user_name")+ "' and
loginPwd='"+uesrLoginInfo.get("user_password")+"'";
resultSet=statement.executeQuery(sql);
PrepareStatement会先对sql语句进行检查,并且查询条件会在编译之后插入
编译条件用?代替,而且会编译自带 ""
//3选择预编译数据库操作对象——要先写sql语句
/**
* "select *from t_user where loginName=? and loginPwd=?";
* ?一个问题 表示一个占位符 占位符不能使用单引号
*/
//String sql="select *from t_user where
loginName='"+uesrLoginInfo.get("user_name")+ "' and
loginPwd='"+uesrLoginInfo.get("user_password")+"'";
String sql="select *from t_user where loginName=?and loginPwd=?";
ps=connection.prepareStatement(sql);
//预编译之后给sql语句中的?传值
//第一个?是下标是1,后面依序增加
ps.setString(1,uesrLoginInfo.get("user_name"));
ps.setString(2,uesrLoginInfo.get("user_password"));
2PrepareStatement还会对sql语句的类型进行安全检查,如原定是String 类型 ,那么如果sql语句中是int类型,其也可以检擦出来 不会到sql执行阶段才报错
3最后一点是PrepareStatement对于完全相同的sql语句 它是编译一次 后续可以执行N次(省去N次编译),而Statement是编译N次执行N次。
因为PrepareStatement在执行sql时执行条件自带’'单引号,所以在进行排序等其他操作时,desc,asc会自动加单引号,所以StatemMent依旧在一些场所可用。
当然排序如果时在最后的话,利用字符串拼接也可以用ParpareStateMent