statement使用方法

Statement statement = connection.createStatement();
String queryString = "select username,password from user_table where username='" +
      username + "' and password='" + password + "'";
ResultSet resultSet = statement.executeQuery(queryString);

statement 为非预编译语句,每次执行会去数据库 生成一条语句执行。

如果 password 变量 赋值为 ' or '1'='1’ 则 整个语句为

select username,password from user_table where username='zhagnsan' and password='' or '1'='1'

 

statement会把这个字符串传给数据库进行执行,此字符串带有注入,所以输入任何信息都会 登陆成功。


prepareStatement 使用方法

 String queryString = "select username,password from user_table where username = ? "
                + "and password = ?";
 preparedStatement = connection.prepareStatement(queryString);
 preparedStatement.setString(1, username);
 preparedStatement.setString(2, password);
 resultSet = preparedStatement.executeQuery();


connection.prepareStatement(queryString); 会把语句传给数据库 生成预编译语句。

  然后username ,password 的值就会变成 两个问号的参数。输入 or ''1'='1'的值只会当成第二个参数值,数据库里预编译的语句 不会把 or 当成 选择关系关键字,只会当成一个参数字符串,传进预编译的语句,这样预编译语句 可以防止注入。


并且预编译语句 不用每次执行都去生成一条执行语句,而是生成一次之后可以多次调用使用,而statement是每次都会将拼接的 String字符串 去数据库生成语句执行。


预编译prepareStatement是statement更有效率。