2011-12-21 73 views
1

我在做一個assigment廣告有一個更新類,它接受了sql和更新表。我正在使用Java。我就是這麼做的哪一個是最好用的,爲什麼?

sqls = "INSERT INTO statistics(ID, TeamName, Wins, Draws, Losses, Points, DatePlayed) VALUES (0 ,'"+var1+"',"+var2+","+var3+","+var4+","+var5+",'"+ date +"')"; 
Class.forName("com.mysql.jdbc.Driver").newInstance(); 
con = DriverManager.getConnection("jdbc:mysql://localhost/players","root", "123"); 
stmt = con.prepareStatement(sqls); 
int updaterows = stmt.executeUpdate(sqls); 

我的老師這樣

sqls = "INSERT INTO statistics(TeamName, Wins, Draws, Losses, Points, DatePlayed) VALUES (?,?,?,?,?,?)" 
Class.forName("com.mysql.jdbc.Driver").newInstance(); 
con = DriverManager.getConnection("jdbc:mysql://localhost/players","root", "123"); 
stmt = con.prepareStatement(sqls); 
stmt.setString(1, var1); 
stmt.setInt(2, var2); 
stmt.setInt(3, var3); 
stmt.setInt(4, var4); 
stmt.setInt(5, var5); 
stmt.setTimestamp(6, var6); 
int updaterows = stmt.executeUpdate(); 

哪一個更好,爲什麼取悅它真的讓我困惑,因爲這兩種方法的工作做到了。

回答

8

絕對使用第二種方式 - 老師的方式。你的方式非常危險,因爲代碼容易出現sql injection。任何人都可以輸入DROP DATABASE作爲TeamName,您的數據庫將會消失。

P.S Some fun - Bobby Tables

+0

thx很多我問,因爲老師沒有告訴我爲什麼要使用秒 – owen 2011-12-21 18:44:25

4

老師的方式更好,因爲它可以防止sql injection攻擊。

0

第二個版本使用查詢參數,並且從SQL注入的角度來看更安全。谷歌SQL注入更多細節。

2

第二種方式是在很多方面更好(teacher`s方式):

安全:

它可以防止SQL注入攻擊。 參考:https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java

伸縮性:

它可以防止由反覆的字符串連接過多內存使用情況。 參考:http://docs.oracle.com/cd/E18930_01/html/821-2431/abebf.html#abebh

性能:

它允許數據庫中創建預處理語句(預編譯SQL查詢)。 參考:http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html

可維護性:

它允許在編譯時SQL參數的類型檢查。

1

這兩種方式你會完成你的工作,第二種方式更好,因爲它更安全,並防止SQL注入。但是我想指出每個人都跳過的一件事,準備好的語句,PreparedStatement調用的使用都是預編譯的,並且性能更好。

如果一個語句在一個會話中被多次使用,預編譯它比將數據發送到數據庫並編譯每次使用提供更好的性能。聲明越複雜,性能優勢越大。 如果一個語句可能只用了幾次,預編譯它可能是低效的,因爲預編譯,保存以及稍後在數據庫中釋放它的開銷。

此外,我會建議你檢查CallableStatement,你可以創建一個存儲過程,並把你的SQL查詢放入它並使用CallableStatement運行你的存儲過程。可調用語句提供了更好的性能,因爲它完全在數據庫上運行(如果你有一個遠程數據庫,並且你的網絡速度很慢,你會注意到性能),並且還有更好的安全性。