1. 程式人生 > >關於JDBC的一些個人理解

關於JDBC的一些個人理解

最近回顧了java基礎方面的一些東西,這裡就jdbc寫一個個人總結,如果有不對的地方,歡迎各位批評指正。

1.什麼是jdbc?

簡單地說,jdbc技術就是用來對資料庫做操作的。它為應用程式訪問資料庫提供了統一的介面,遮蔽了各種資料庫之間的異構性,保證了程式的可移植性。在jdbc中開發者可以通過jdbc api將標準的sql語句通過jdbc驅動管理器傳遞給相應的jdbc驅動,並由該驅動傳送給指定的資料庫伺服器。

2.jdbc開發步驟

1.載入驅動、建立與資料庫的連線
        載入JDBC驅動程式:Class.forName("驅動程式類名");
        建立資料庫連線:Connection con = DriverManage.getConnection(String url, String username, String password);
2.執行SQL語句:statement物件和PreparedStatement物件
        Statement stmt = con.createStatement();
        boolean a = stmt .execute(sql);  、
3.處理結果集
4.關閉資料庫連線 

其中url指向資料庫的地址,user為資料庫使用者名稱,passcard為資料庫密碼。通常情況下為了減少程式碼的冗餘,這些東西都被寫在配置檔案中。
上訴execute(String sql)方法用於執行ddl語句,其返回為boolean值,返回為true表示有結果集,返回為false表示無結果集。除此之外,可用executeUpdate(String sql)方法執行DML語句,返回的結果表示受影響的行數,是個數字。executeQuery(String sql)方法用於執行dql查詢語句,返回的結果是一個ResultSet物件,可以通過遍歷來處理結果集。(其他更多api,例如批量執行等可查閱jdbc api文件)

3.statement物件和preparedStatement物件

preparedStatement是statement物件的一個子介面,建立preparedStatement物件的時候就指定了sql語句,並立刻傳送給DBMS進行編譯,也就是預編譯。在執行預編譯語句的時候DBMS就可以直接執行編譯後的SQL語句,不需要像其他SQL語句一樣先編譯。而通過Statement物件執行sql語句時,需要將Sql語句傳送給DBMS,由DBMS首先進行編譯再執行,效果極差。
預編譯語句還支援帶引數的SQL語句,對相同的SQL可以替換引數多次使用。因此使用預編譯語句可減少執行時間,提高執行效率。Statement主要用於執行靜態sql,即內容不變的sql。PreparedStatement可以重用執行計劃,比較適合反覆往資料庫中加一批資料。
執行計劃

:面向資料庫。sql語句面向人,資料庫不認識sql語句,sql語句會翻譯成執行計劃(類似.java檔案編譯成位元組碼檔案),資料庫會根據執行計劃做相應的操作,當sql語句完全一樣的情況下會重用執行計劃。

statement物件的使用上面已經有過案例了,下面的preparedStatement物件的一個使用demo。`

......
PreparedStatement ps = new PreparedStatement("update table set a = ? where b = ?");
ps.setLong(1,"aa");			//1表示第一個引數,aa是引數值
ps.setInt(2,10);
ps.executeUpdate();
......

通過上訴這個例子,我們還可以看出,preparedStatement物件還可以有效的防止注入攻擊,因為使用者輸入的內容只會作為sql中的引數傳入,而不會作為sql語句的一部分,因為sql語句在建立preparedStatement物件的時候已經編譯了。

注入攻擊:使用者輸入含sql成分的引數,引數在拼接sql的時候造成了sql語句的語義更改。
舉個例子:select count(*) from table where passcard= ‘1’ or ‘1’ = ‘1’;使用者在這裡輸入了1’ or ‘1’ = ‘1作為密碼,結果是登入成功。
但使用peparedStatement時這裡的1’ or ‘1’ = '1會作為?的引數傳入,這個時候不會造成注入攻擊。

4.連線池技術

當併發訪問資料庫時,每次與資料庫互動都需要建立資料庫連線,這樣會造成巨大的資源浪費,會嚴重影響系統的效能,這個時候就需要使用資料庫連線池。
所謂連線池,就是在系統初始執行的時候,主動去建立足夠的資料庫連線,來組成連線池,當程式中需要訪問資料庫時不需要重複建立連線,而是去連線池中去取,取完了之後也不關閉,而是把這個連線歸還給連線池。
使用步驟:
1.初始化連線池物件:BasicDataSource ds = new BasicDataSource();
2.設定必須引數driver、url、username、password.例:ds.setUlr(url);
3.設定管理策略引數:最大連線數()、初始化連線數等。
4.取出資料庫中的資料庫連線:Connection conn = ds.getConnection
5.執行sql語句:Statement st = conncreateStatement();
6.處理結果
7.歸還連線到連線池 conn.close();注意這個close()方法不是關閉連線!而是把連線歸還到連線池
同樣的,我們可以把連線池相關的一些引數資訊寫到*.properties檔案中。