1.PreparedStatement
PreparedStatement是java.sql包下的一个接口同时也是Statement的子接口,作用是用来执行SQL的语句,通过connection.PreparedStatement(sql语句)的方式可以获取PreparedStatement的一个对象。在执行到这个语句的时候数据库系统会对()中sql 的语句进行预编译的处理。sql语句被编译号之后,则sql语句可以在后续的代码中重复使用。
2.Statement
Statement也是java.sql包下的一个接口,在数据库执行一次性存储的时候,使用Statement对象进行处理。其原因是因为PreparedStatement的开销比较大
3.二者的区别
①.PreparedStatement代码的可读性和可维护性更佳以及代码更加安全
// 使用Statement的弊端:需要拼写sql语句,并且存在SQL注入的问题
//执行时在输入userName password 的时候输入以下代码即使数据库不存在此用户信息也可以登入成功
// SELECT user,password FROM user_table WHERE USER = '1' or ' AND PASSWORD = '
// ='1' or '1' = '1';
//这次体现出了Statement的拼接问题 可读性差和可维护性差的问题
String sql =
"SELECT user,password FROM user_table WHERE USER = '" + userName + "' AND
PASSWORD = '" + password+ "'";
-----------------------------------------------------------------------------------------
String sql =
"SELECT user , password from user_table where user=? and password =?";
// ?是占位符 ps.setSting(第几个占位符,要赋的具体值)
ps.conn.prepareStatement(sql);
ps.setSting(1, **** )
ps.setSting(2, **** )//ps是prepareStatement的一个实例
//不存在拼接问题 而且可读性更高可维护性更佳
}
上述的代码可以看出Statement语句的可读性太差了,就算是自己过段时间去看都会感觉模糊。
②.PreparedStatement的效率性能更佳
PreparedStatement在DBServer会对预编译的语句提供性能的优化,因为预编译语句很可能被重复的调用,使用在语句被DBServer的编译器编译后的执行代码就会被缓存下来,下次调用的时候只要是系统的预编译语句就不需要再次编译,只需要把参数直接传入编译过的语句中就可以执行。
Statement语句中即使是系统的操作,但是因为数据内容不一样,所以语句本身就不能匹配,没有缓存的语句的意义,事实是没有数据库会对普通语句编译后的执行代码进行缓存,这样每次执行一次都要对传入的语句编译一次。
③PreparedStatement的可以实现Blob类型的写入和读取,而Statement做不到