当阅读不同的帖子时,一个问题出现在脑海中,在哪里准备语句预编译,在jvm中还是在db中?这个过程什么时候在java类中实际发生。=
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PreparedStmtDemo {
public static void main(String args[]) throws SQLException,Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","scott","tiger");
PreparedStatement preStatement = conn.prepareStatement("select RollNo from student where Stream =?");
preStatement.setString(1, "Commerce");
ResultSet result = preStatement.executeQuery();
while(result.next()){
System.out.println("Roll No: " + result.getString("RollNo"));
}
}
}
JDBC驱动程序将PreparedStatement预编译为SQL语句,该语句涉及将参数从Java数据类型映射到SQL数据类型。
预编译语句在Oracle数据库中池化。
与普通语句相比,PreparedStatement具有以下优点:
- sql注入攻击防护
- 如果您在java中使用其他参数重用PreparedStatement实例,JDBC驱动程序不需要再次预编译它
- Oracle数据库可以重用池SQL语句
但是如果你不使用查询参数,那么Statement和PreparedStatement的行为方式是一样的