JDBC中使用預編譯Statement以及它的優點

JDBC中PreparedStatement與Statement一樣是用於執行SQL語句的,比如增加,刪除

1. 使用PreparedStatement

和 Statement一樣,PreparedStatement也是用來執行sql語句的,與創建Statement不同的是,需要根據sql語句創建PreparedStatement。除此之外,還能夠通過設置參數,指定相應的值,而不是Statement那樣使用字符串拼接:

String sql = "insert into hero values(null,?,?,?)";
Connection c = DriverManager.getConnection(...);
// 根據sql語句創建PreparedStatement
PreparedStatement ps = c.prepareStatement(sql);

// 設置參數
ps.setString(1, "...");
ps.setFloat(2, 313.0f);
ps.setInt(3, 50);
// 執行
ps.execute();

2. PreparedStatement的優點1 - 參數設置

Statement 需要進行字符串拼接,可讀性和維護性比較差

String sql = “insert into hero values(null,”+"‘提莫’"+","+313.0f+","+50+")";

PreparedStatement 使用參數設置,可讀性好,不易犯錯

String sql = “insert into hero values(null,?,?,?)”;

3. PreparedStatement的優點2 - 性能表現

PreparedStatement有預編譯機制,性能比Statement更快

// Statement執行10次,需要10次把SQL語句傳輸到數據庫端
// 數據庫要對每一次來的SQL語句進行編譯處理
Statement s = c.createStatement();
for (int i = 0; i < 10; i++) {
    String sql = "insert into hero values(null," + "'...'" + ","
            + 313.0f + "," + 50 + ")";
    s.execute(sql);
}


// PreparedStatement 執行10次,只需要1次把SQL語句傳輸到數據庫端
// 數據庫對帶?的SQL進行預編譯

// 每次執行,只需要傳輸參數到數據庫端
// 1. 網絡傳輸量比Statement更小
// 2. 數據庫不需要再進行編譯,響應更快
String sql = "insert into hero values(null,?,?,?)";
PreparedStatement ps = c.prepareStatement(sql);
for (int i = 0; i < 10; i++) {
    ps.setString(1, "提莫");
    ps.setFloat(2, 313.0f);
    ps.setInt(3, 50);
    ps.execute();
}

4. PreparedStatement的優點3 - 防止SQL注入式攻擊

假設name是用戶提交來的數據

String name = “‘IronMan’ OR 1=1”;

使用Statement就需要進行字符串拼接
拼接出來的語句是:

select * from hero where name = ‘IronMan’ OR 1=1

因爲有OR 1=1,這是恆成立
那麼就會把所有的人都查出來,而不只是IronMan
如果表裏的數據是海量的,比如幾百萬條,把這個表裏的數據全部查出來
會讓數據庫負載變高,CPU100%,內存消耗光,響應變得極其緩慢

而PreparedStatement使用的是參數設置,就不會有這個問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章