产生原因: 因为SQL语句拼接,传入了SQL语句的关键字。这样做可以绕过数据库的安全检查,从而获取里面的数据 客户端利用JDBC-【Statement】的缺点,传入非法的参数,从而让JDBC返回不合法的值,我们将这种情况下,统称为SQL注入。 解决方案: 使用PreparedStatement对象就可以解决。PreparedStatement对象预处理对象。允许使用占位符对SQL语句中的变量进行占位。对SQL语句进行预先编译。传入SQL语句的关键字,不会被当成关键字而是普通的字符串。包括:程序执行时动态为?符号设置值,安全检查,避免SQL注入问题,预处理能力 select * from user where username = ? and password = ? Statement与PreparedStatement的区别 现在项目中都不直接用Statement了,而用PreparedStatement。 PreparedStatement它除了具有Statement是所有功能外, 还有动态SQL处理能力,包括:程序执行时动态为?符号设置值,安全检查,避免SQL注入问题,预处理能力。
Statement只能处理静态SQL 1,PreparedStatement既能处理静态SQL,又能处理动态SQL,它继承了Statement的特点 2,站在预处理这个角度来说的: PreparedStatement【适合】做连续多次相同结构的SQL语句,有优势。 Statement【适合】做连续多次不相同结构的SQL语句,有优势。 适合:是只效率会更高,但并不表示一定要这才样 3,PreparedStatement 1_支持动态SQL,也支持静态SQL 2_预处理 —相同结构的SQL select id,name from users where id = 1 select id,name,gender from users where id = 2; 是不相同结构 —不同结构的SQL 声明: 静态SQL也可以用PreparedStatement 适合: 静态SQL—优先Statement 动态SQL—优先PreparedStatement