关于 parperedstatement和statement的故事

  1. ps可以传递参数

  2. ps性能更为优化,具体原因:使用ps时sql会被预编译到数据库系统中(大概是一个什么缓存中把),但我们重复调用时效率更高,数据库压力更小;这个地方要注意的是,要想得到这种性能上的提升我们必须使用“?”占位符,而不能直接把字符串写入到sql语句中,比如

  3. “select * from users where username=?”

  4. “select * from users where username = “+username     //username是我们程序里面定义的一个字符串

  5. 上面的第二种写法就不再具有性能提升的功能

  6. ps可以防止sql注入,sql注入举例:

  7. sql:“select * from users where username = ”+username+”and password = “+password

  8. 当恶意传入的参数为:username = “‘1’ or ‘1’ = ‘1’ “   password =  “‘1’ or ‘1’ = ‘1’ “ 时,sql变成了:select * from user where username =’1’ or ‘1’ = ‘1’ and password = ‘1’ or ‘1’ = ‘1’ 

  9. 这样就能直接登录了,而ps的占位符能解决这个问题,然后还有一种解决方案是:”SELECT * FROM users WHERE name = ‘“ + userName + “‘ and pw = ‘“+ passWord +”‘;这样写的sql也可以做到防止注入,但是看起来也不保险;

关于rs的故事:

            一个ps同一时间只能有一个rs,这是什么意思呢,就是我打开了一个ps,这个ps是绑定了sql语句的,然后我用ps创建了一个结果集rs,我对这个rs一顿操作,但是当我想用前面的ps创建第二个结果集rs1的时候,系统默认关闭第一个结果集rs;这导致我们想要进行嵌套操作的时候,必须获取不同的ps,这个地方,同一个conn是可以创建不同ps的,不用再去获取新的连接;