1. 程式人生 > >關於JDBC預處理功能PreparedStatement

關於JDBC預處理功能PreparedStatement

java 例如 性能 rep pst arc 預防sql註入 stmt tco

1、PreparedStatement的定義

PreparedStatement是java.sql包下面的一個接口,用來執行SQL語句查詢,通過調用connection.preparedStatement(sql)方法可以獲得PreparedStatment對象。數據庫系統會對sql語句進行預編譯處理(如果JDBC驅動支持的話),預處理語句將被預先編譯好,這條預編譯的sql查詢語句能在將來的查詢中重用,這樣一來,它比Statement對象生成的查詢速度更快。如下:

Connection conn = DBConnection.getConnection(); //獲得連接對象
String findByIDSQL = "select * from " +
"tb_employee where employeeID = ?"; //SQL語句
PreparedStatement pstmt = null; //聲明預處理對象
ResultSet rs = null;
Employee employee = null;
try {
pstmt = conn.prepareStatement(findByIDSQL); //獲得預處理對象並賦值
pstmt.setInt(1, employeeID); //設置參數
rs = pstmt.executeQuery(); //執行查詢

………… ………… 2、預處理的優勢
  • PreparedStatement可以寫動態參數化的查詢
    用PreparedStatement你可以寫帶參數的sql查詢語句,通過使用相同的sql語句和不同的參數值來做查詢比創建一個不同的查詢語句要好,下面是一個參數化查詢:
    1
    SELECT interest_rate FROM loan WHERE loan_type=?

    現在你可以使用任何一種loan類型如:”personal loan”,”home loan” 或者”gold loan”來查詢,這個例子叫做參數化查詢,因為它可以用不同的參數調用它,這裏的”?”就是參數的占位符。

  • PreparedStatement
    Statement 更快
    使用 PreparedStatement 最重要的一點好處是它擁有更佳的性能優勢,SQL語句會預編譯在數據庫系統中。執行計劃同樣會被緩存起來,它允許數據庫做參數化查詢。使用預處理語句比普通的查詢更快,因為它做的工作更少(數據庫對SQL語句的分析,編譯,優化已經在第一次查詢前完成了)。為了減少數據庫的負載,生產環境中德JDBC代碼你應該總是使用PreparedStatement 。值得註意的一點是:為了獲得性能上的優勢,應該使用參數化sql查詢而不是字符串追加的方式。

總結:這個功能一大優勢就是能提高執行速度尤其是多次操作數據庫的情況,再一個優勢就是預防SQL註入,嚴格的說,應該是預防絕大多數的SQL註入。

例如學生表裏有"學號"和"姓名"兩個字段,(學號是是number(9),姓名是varchar2(20).Oracle數據庫)
sql="insert into student values(?,?)";
PreparedStatement ps=conn.prepareStatement(sql); //conn是Connection
ps.setInt(1,202060510); //"1"對應第一個"?","2"對應第二個"?"
ps.setString(2,"fannge");
ps.executeUpdate();

關於JDBC預處理功能PreparedStatement