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使用的是參數設置,就不會有這個問題