很多读者学习SQL编程时都会发现书写“拼接”的字符串时有点麻烦,很容易写错引号,这时就需要占位符的出现。而JDBC里的Statement在执行SQL语句是不允许占位符的,但是PreparedStatement可以满足这个需求。熟悉Java的朋友可能知道,String有个format方法也可以完成类似的工作,但从下面的分析可以看出,PreparedStatement的作用不只是方便“拼接”SQL语句而已。
1. 方便
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592)我们使用?作为占位符,使用setXxx设置参数。(从1开始数)
2.效率高
PreparedStatement的执行效率是比Statement快的(因为它是预编译的),这里指的是执行的那些语句可以用上面的含占位符的SQL语句表示。
3.防止注入
下面是个常见的SQL注入例子,
String sql = "select * from table1"
+"where name='"+username
+"'and pwd='"+userpass+"'";
如果用户输入 'or true or'
就被解析为:
select * from table
where name='' or true or '' and pwd=''
这样,SQL把true当作常量,就能登录了。但是,使用PreparedStatement可以防止这个问题。