PreparedStatement和Statement的区别

PreparedStatemen实例

String sql = "select * from t_user where username = ? and password = ?";
preparedStatement = connection.prepareStatement(sql);
//preparedStatement = connection.prepareStatement("select * from t_user where username = ? and password = ?");同上述两行代码
preparedStatement.setString(1, username);//将username对应的value赋给第一个参数
preparedStatement.setString(2, password);//将password对应的value赋给第二个参数
resultSet =  preparedStatement.executeQuery();//执行,注意()不能有sql语句,不同于Statment
System.out.println("sql=" + preparedStatement.toString());//打印sql

Statement实例

String sql = "select * from t_user where username = '"+username+"' and password = '"+password+"'";//拼接sql
statement = (Statement) connection.createStatement();//创建Statement对象
resultSet = statement.executeQuery(sql);//执行sql
System.out.println(sql);//打印sql

联系:

  1. PreparedStatement和Statement都是用来执行SQL查询语句的API之一
  2. PreparedStatement接口继承了Statement接口

区别:

  1. PreparedStatement和Statement的sql语句放置的位置不同
preparedStatement = connection.prepareStatement(sql);

resultSet = statement.executeQuery(sql);
  1. Statement不对sql语句作处理,直接交给数据库;而PreparedStatement支持预编译,会将编译好的sql语句放在数据库端,相当于缓存。对于多次重复执行的sql语句,使用PreparedStatement可以使得代码的执行效率更高。

  2. Statement的sql语句使用字符串拼接的方式,容易导致出错,且存在sql注入的风险;PreparedStatement使用“?”占位符提升代码的可读性和可维护性,并且这种绑定参数的方式,可以有效的防止sql注入。

SQL注入

sql注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

实例:
用户在进行登录时,需要验证用户名和密码,对应后台的sql语句为 select * from tableName where username = ‘XXX’ and password = ‘XXX’,XXX为传入的用户名和密码,根据sql返回的结果判断登录是否成功。
假如数据库中存在username为ashley,password为123456这条记录,此时在登录界面输入用户信息,不出意外会登录成功。但是假如我们在输入时把password的内容改为123456’ or ‘aaa’ = 'aaa,生成的sql为: select * from tableName where username = ‘ashley’ and password =‘123456’ or ‘aaa’ = ‘aaa’,这样一来,也会登录成功


版权声明:本文为ashleyjun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。