预编译Statement优点
- 执行效率高
由于预编译语句使用占位符 ”?”,在执行SQL之前语句会被先发送到Oracle服务器进行语法检查和编译等工作,并将SQL语句加入到Oracle的语句缓冲池里,随后再对SQL语句中的占位符”?”设置定值。
那么也就说如果你要执行1000行插入的时候第一次先SQL语句发送给Oracle服务器处理,接着以后只传递值给占位符就可以了。
因此它不需每次传递大量的SQL语句也无需对每条SQL语句做语法检查和编译所以比较高效。
- 安全,可防止SQL注入攻击
//用户登录的时候,假设有下面的语句select * from student where username='' and password=''//写为字符串为String sql = "select * from student where username='"+username+"' and password='+password+"'"//用户如果输入' or 1=1 --//对应的SQL语句select * from student where username='' or 1 =1 -- and password=''//上面这句SQL等同于下面select * from student
PrepareStatement ps = conn.prepareStatement("select * from student where num = ? and name = ?")
2.设置占位符的内容
占位符的索引从1开始,使用setXxx方法,数据要跟列的数据对应
Void setXxx((int parameterIndex, Xxx value); Xxx表示相应的数据类型。
设置点位符位置的值,第一个参数是 1,第二个参数是 2,…..
ps.setInt(1,12);ps.setString(2,"张三");
3.执行
- `boolean execute()` 在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。- `ResultSet executeQuery()` 在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。- `int executeUpdate()` 在此 `PreparedStatement` 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句 比如 `INSERT`、`UPDATE` 或 `DELETE` 语句; 或者是无返回内容的 SQL 语句,比如 `DDL` 语句。 返回一个已修改数据库中的数据数目数```ps.executeQuery();```
Statement与PrepareStatement比较
|
Statement |
PreparedStatement |
| 创建语句对象的方法 |
Connection.createStatement( ) |
Connection.preparedStatement( sql ) |
| 查询 |
executeQuery( sql ) 要提供SQL语句 |
executeQuery( ) 不提供提供SQL语句,但随后要设置占位符的值 |
| 插入、更新、删除 |
executeUpdate( sql ) 要提供SQL语句 |
executeUpdate( ) 不提供提供SQL语句 |
| 执行语句 |
execute() |
execute() |