当用户名输入的值为wang'#或者wang' or '1=1,我们只需要输入用户名,不需要输入密码即可登录
本质上是因为sql语句包含了sql关键字# or 1=1,造成了系统的安全漏洞
PreparedStatement对象的优势
1 防止SQL注入攻击问题:把(输入的所有值)SQL关键字当做普通的文本(串串)来处理。
2 省略了参数拼接的过程。
3 提高了程序的访问效率。
SQL书写简洁:把参数用一个问好来代替,问号叫占位符。
先把带有问号的SQL(SQL骨架)发送给数据库服务器,服务器先编译。
ps.setString(x,y);//x—匹配?的位置,x的值要和?的顺序匹配 y—参数的值。
使用ps.executeQuery();无参的方法
把含有?的一条SQL,这种SQL叫做SQL骨架,先把SQL骨架发送给数据库服务器,参数的值需要手动设置。
String sql="select * from user where username=? and password=?";
//先把SQL骨架(select * from user where username=? and password=?)
//发给数据库服务器编译,等待给?-占位符赋值
ps=conn.prepareStatement(sql);
//第一个参数的值要和?的顺序保持一致
ps.setString(1, name);//给哪个?设置值 给?设置啥值
ps.setString(2, pwd );
rs=ps.executeQuery();
带有缓存的效果,提高程序的执行效率:先把相同的SQL骨架缓存(保存到硬盘)起来,当下次来访问相同骨架的SQL时,直接去缓存中取,而不用数据库了,提高程序的执行效率。