关于Statement与PreparedStatement的用法

来源:互联网 发布:淘宝网海南黄花梨手串 编辑:程序博客网 时间:2024/05/29 17:39

   在学习JDBC时操作数据库时,例如向MysQL数据库中的users表中执行一条插入语句,我们可以这样写:“insert into users(id,name,sex,age,birthday) values(?,?,?,?,?);”,也可以这具体的写,“insert into users (id,name,sex,age,birthday) values(1,”liming”,’M’,18,’1991-10-13’);”

学过Java的人知道第一种写法是使用PreparedStatement预处理语句的写法,使用这种写法,最大的好处是,可以防止程序的注入问题的产生,例如登陆用户名采用' or 1=1 or name='的形式输入时,你便会查询到数据库中的所用信息,当然,也会登陆成功,是因为,在使用Statement的语句对象st时,当执行到st.executeQuery(sql);语句时,我们的sql语句中的' or 1=1or name='是按照逻辑运算符处理的,这样处理后的接果是,无论你是否输入正确,程序都会正确执行,这样我们的数据保存和维护就存在着极大的安全隐患,为了消除这种隐患,我们会采用PreparedStatement的预处理语句来进行为占位符的赋值工作,这样,在使用PreparedStatement的语句对象ps时,当执行到ps = conn.prepareStatement(sql);语句时,程序会自动编译对语句进行预处理,这样,当我们再次输入' or1=1 or name='时,程序会将它视为为某一占位符所赋的值而不会再认为是逻辑运算符而避免了程序的运行时的注入问题。

 

但是,对于PreparedStatement的使用一定要谨慎,例如我们在调用ps的执行查询的方ps.executeQuery();法时,一定要注意,不要写成ps.executeQuery(sql);(sql为你的查询语句),因为如果这样,程序会按照是Statement的一般执行方法来对待,而不是PreparedStatement预处理语句的方法,这样也会导致你的程序出现错误,如:

You have anerror in your SQL syntax; check the manual that corresponds to your MySQLserver version for the right syntax to use near '?' at line 1

 所以,一定要谨慎使用、正确使用。

0 0
原创粉丝点击