JSP 预处理语句的优点
预处理语句具有两个主要的优点:
● 查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。对于复杂查询来说,如果要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得应用变慢。通过使用一个预处理语句就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。
● 传给预处理语句的参数不需要使用引号,底层驱动会处理这个。如果应用独占地使用预处理语句,就可以确信没有SQL注入会发生。
正因为预处理语句是如此有用,它成了PDO惟一为不支持此特性的数据库提供的模拟实现。这使你可以使用统一的数据访问规范而不必关心数据库本身是否具备此特性。
在JDBC组件中,PreparedStatement接口创建表示预编译的SQL语句的对象。SQL语句经过预编译,并存储在PreparedStatement对象中。然后,此对象可用来有效地多次执行此语句。
PreparedStatement接口继承Statement类,并与之在两方面有所不同:
● PreparedStatement实例包含已编译的SQL语句。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。因此,多次执行的SQL语句经常创建为PreparedStatement对象,以提高效率。
● 包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参参。IN参数的值在SQL语句创建时未被指定。相反的,该语句为每个IN参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的SetXXX方法来提供。
作为Statement的子类,PreparedStatement继承了Statement的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代IN参数占位符的值。同时,三种方法execute、executeQuery和executeUpdate已被更改又以使其不再需要参数。这些方法的Statement形式(接受SQL语句参数的形式)不应该用于PreparedStatement对象。其详细信息如表6-6所示:
表6-6 PreparedStatement接口方法
方法名称 | 功能描述 |
clearParameters() | 立即清除当前参数值 |
execute() | 执行任何种类的SQL语句 |
executeQuery() | 在此PreparedStatement对象中执行SQL查询,并返回由该查询生成的结果集 |
executeUpdate() | 在此PreparedStatement对象中执行 SQL INSERT、UPDATE 或 DELETE 语句 |
setBoolean (int parameterIndex, boolean x) | 将指定的参数设置为Java boolean值。当它发送至数据库时,DB2 Everyplace JDBC驱动程序将它转换为SQL SMALLINT值 |
setBytes(int parameterIndex, byte[ ]x) | 将指定的参数设置为字节的Java数组 |
setDate(int parameterIndex, Date x) | 将指定参数设置为java.sql.Date值 |
setDouble(int parameterIndex, double x) | 将指定的参数设置为Java双精度值。当它发送至数据库时,DB2 Everyplace JDBC驱动程序将它转换为 SQL DECIMAL值 |
jsp编译过程setInt (int parameterIndex, int x) | 将指定的参数设置为Java int值 |
setNull (int parameterIndex, int sqlType) | 将指定的参数设置为SQL NULL |
setObject(int parameterIndex, Object x, int targetSqlType) | 使用给定对象来设置指定参数的值 |
上述表格中,setxxx类型方法还有setLong()、setString()等,其含义和表格中方法相同,这里就不在介绍。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论