JDBC中的PreparedStatement和Statement
statement
性能方面:
由于每一句sql语句都会在sql语句编译前很清楚的得到,比如select *from user where name = ‘name’ and pwd = ‘pwd’
每次输入的name和pwd都可能不同这样每次都会获得不同sql语句,由于每产生一个sql语句数据库服务器都会先去预编译池中寻找是否存在,若存在则不编译,若不存在则会编译。所以每当从页面中获得的name 和pwd不同时,数据库服务器都会再重新编译一次。
字符串拼接复杂
sql语句在拼接时整型变量和字符变量的拼接都不同,所以在开发时特别容易出现字符串拼接错误。
安全方面
容易发生sql注入,再用户不知道用户名和密码的时候,使用sql注入也能进入系统。
String userName= " 'OR 1=1 OR ' ";
String passWord="231";
String sql = "select * from user where name = '"+userName+"'and pwd = '"+passWord+"'";
运行结果:select * from user where name = ’ ’ OR 1=1 OR ’ ’ and pwd = ‘123’
preparedstatement
性能方面:
使用的是占位符,如上select *from user where name = ?and pwd = ?
这属于一句完整的sql语句所以数据库服务器接收到时会将它直接编译到预编译池中,当接收name和pwd的值时,再进行解析然后交给数据库服务器去执行。所以只需要编译一次。接收到不同的值只需要再去重新解析就行了。
需要大量使用CRUD的时候建议使用。
字符串拼接
使用?占位符,不需要进行字符串拼接
安全方面
可以防止sql注入,会将传进来的('单引号)给进行转义,会转义成"/"
注意
MySQL没有预编译池,Oracle有预编译池。