Statement和PreparedStatement的區別

1).PreparedStatement 代碼的可讀性和可維護性. (SQL模板,使用佔位符表示參數)

String sql = "select * from t_student where name = ? ";
		//連接數據庫
		Connection conn = DBUtils.getConnection();
		//創建語句對象
		PreparedStatement ps = conn.prepareStatement(sql);
		//爲第一個佔位符(?)設置值
		ps.setString(1, "小花");
		
		ResultSet result = ps.executeQuery();
		if(!result.next()){
			throw new RuntimeException("賬號或密碼錯誤");
		}
		System.out.println("登錄成功");
		
	}

2).PreparedStatement 能最大可能提高性能. MySQL不支持.

當應用程序從數據庫中存取數據時,需要傳入sql語句,這時候數據庫需要對sql語句做一系列的操作才能返回結果,這個過程也挺複雜的:

01.檢查緩存中是否存在sql

02.檢查sql的完整性

03.檢查sql的安全性

04.編譯sql語句

05.返回結果

若是從數據庫中查詢數據,使用Statement,查詢不同id的數據,在緩存中就是不同的sql語句,若是查詢大量的數據,這種方式就會很慢,若是使用PreparedStatement ,即使是查詢不同id的數據,在緩存中也只存在一條sql語句,大大提高了查詢效率。

 

3).PreparedStatement 能保證安全性.可以防止SQL注入:

Statement語句對象若是執行String sql = "select * from t_student where name = admin and password ='' or 1=1 or ''"; SQL語句,它會將or 1=1 or ''看成一個or條件,1=1 條件是恆爲true的,也就是說,不管前面的條件如何,整體條件都爲true,因此如果用Statement語句類去寫登錄條件,只要有人在賬號或密碼那裏填 or 1=1 ,都能進入系統。

PreparedStatement 的話就不一樣,它會將整個 or 1=1 or '' 看成password的值,你輸入的密碼跟實際密碼不符合,就不能進入系統。



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