end -- 关于jdbc的conn、ps、rs、pool
关于 parperedstatement和statement的故事
ps可以传递参数
ps性能更为优化,具体原因:使用ps时sql会被预编译到数据库系统中(大概是一个什么缓存中把),但我们重复调用时效率更高,数据库压力更小;这个地方要注意的是,要想得到这种性能上的提升我们必须使用“?”占位符,而不能直接把字符串写入到sql语句中,比如
“select * from users where username=?”
“select * from users where username = “+username //username是我们程序里面定义的一个字符串
上面的第二种写法就不再具有性能提升的功能
ps可以防止sql注入,sql注入举例:
sql:“select * from users where username = ”+username+”and password = “+password
当恶意传入的参数为: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’
这样就能直接登录了,而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的,不用再去获取新的连接;
