標籤:
第十六章 整合資料庫16.1 JDBC入門16.1.1 JDBC簡介
1、JDBC是java線上資料庫的標準規範。它定義了一組標準類與介面,標準API中的介面會有資料庫廠商操作,稱為JDBC驅動程式。
2、JDBC標準主要分為兩個部分:JDBC應用程式開發人員介面和JDBC驅動程式開發人員介面。應用程式需要線上資料庫,其相關API主要在java.sql和javax.sql兩個包中。
3、應用程式使用JDBC線上資料庫的通用文法:
Connection conn = DriverManager.getConnection(……);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM T_USER");
4、JDBC希望達到一個“寫一個java程式,操作所有資料庫”的目的。
5、磁碟機按照操作方式可分為四種類型:
(1)JDBC-ODBC Bridge Driver :其在Microsoft系統上最為成熟。
缺點:ODBC在平台上先設定好,彈性不足;本身也有跨平台限制。
(2)Native API Driver:以原生方式,調用資料庫提供的原生連結庫。
缺點:有跨平台限制
優點:速度最快
(3)JDBC-Net Driver :將JDBC方法調用轉換為特定的網路通訊協定調用
優點:跨平台
缺點:速度慢,獲得架構彈性是使用這種類型驅動程式的目的
(4)Native Protocol Driver :由資料庫廠商直接提供
優點:跨平台 ——是最常見的驅動程式類型。
16.1.2 串連資料庫
1、要串連資料庫,必須在CLASSPATH中設定驅動程式JAR文檔。
2、基本資料庫操作相關JDBC介面或類是為位於java.sql包中。要取得資料庫聯機,需要進行幾個動作:
(1)註冊Driver對象
(2)取得Connection操作對象
(3)關閉Connection操作對象
3、註冊Driver對象
使用JDBC要求載入.class文檔的4種方式:
(1)使用Class.forName()
(2)自行建立Driver介面操作類的執行個體
(3)啟動JVM時指定jdbc.drivers屬性
(4)設定JAR中/services/java.sql.Driver文檔
4、取得Connection操作對象
Connection介面的操作對象是資料庫聯機代表對象。其定義了資料庫連接時的協議、子協議、資料來源識別:
協議:子協議:資料來源識別
協議:jdbc
子協議:橋接的驅動程式
資料來源識別:標出資料庫的地址、連接埠號碼、名稱、使用者、密碼等資訊。
注意:要使用中文存取必須給定參數useUnicode和characterEncoding。表明是否使用Unicode,並指定字元編碼方式。
在XML設定檔中,不能直接寫&符號,要寫成&。
16.1.3 使用Statement、ResultSet
1、Statement是SQL描述的代表對象,可以使用executeUpdate()、executeQuery()等方法來執行SQL。
2、Statement的executeUpdate()方法用於SELECT等查詢資料庫的SQL,返回int結果,表示資料變動的筆數
3、Statement的executeQuery()方法返回java.sql.ResultSet對象,代表查詢結果。
4、Statement的execute()方法用來執行SQL,返回true表示SQL執行將返回ResultSet作為查詢結果。
16.1.4 使用PreparedStatement、CallableStatement
1、如果有些操作只是SQL語句當中某些參數會有所不同,其餘的SQL子句皆相同,則可以使用java.sql.PreparedStatement。調用clearParametere()清除設定的參數,之後就能再次使用這個PreparedStatement執行個體。
2、使用PreparedStatement的好處:
(1)可以將SQL描述先行編譯為資料庫的執行指令,執行速度可以快很多。
(2)防止SQL注入
3、如果撰寫資料庫的預存程式,並想要使用JDBC來調用,則可使用java.sql.CallableStatement。必須調用prepareCall()建立CallableStatement異常,可以使用registerOutParameter()註冊輸出參數。
16.2 JDBC進階16.2.1 使用DataSource取得聯機
1、讓MessageDAO依賴於java.sql.DataSource介面,可以通過其定義的getConnection()方法取得Connection。
2、日後要修改資料庫伺服器主機位置,為了打算重複利用Connection對象而想要加入聯機池機制等情況,這個MessageDAO都不用修改。
3、聯機相關資訊可以使用.properties設定。
16.2.2 使用ResultSet捲動、更新資料
1、建立Statement或PreparedStatement執行個體時,可以指定結果集類型與並行方式。
createStatement(int resultSetType,int resultSetConcurrency) prepareStatement(String sql,int resultSetType,int resultSetConcurrency)
2、結果集類型resultSetType可以指定3種:
ResultSet.TYPE _ FORWARD _ ONLY(預設)
ResultSet.TYPE _ SCROLL _ INSENSITIVE
ResultSet.TYPE _ SCROLL _ SENSITIVE
3、更新設定resultSetConcurrency可以指定2種:
ResultSet.CONCURREADONLY(預設)
ResultSet.CONCUR_UPDATABLE
4、ResultSet進行資料修改的條件限制
必須選取單一表格
必須選取主鍵
必須選取所有NOT NULL的值
16.2.3 批次更新
1、批次更新的限制是,SQL不能使SELECT,否則會拋出異常。
2、要支援批次更新,必須在JDBC URL 上附加rewriteBatchedStatements = true 參數才有實際的作用。
16.2.4 Blob與Clob
1、BLOB用於儲存大量的位元據,像是圖檔、影音檔等;CLOB用於儲存大量的文字資料。
2、可以把BLOB欄位對應byte[]或輸入\輸出串流。
16.2.5 交易簡介
1、交易的四個基本原則:
原子性:若有一個步驟失敗,必須撤回曾經執行過的動作,回到交易前的狀態
一致性:交易作用的資料集合在交易前後必須一致
隔離行為:交易與交易之間,必須互不干擾
持久性:即使系統掛了,交易的結果也不能遺失
2、在交易管理時,僅想要撤回某個SQL執行點,則可以設定儲存點。
3、資料庫可設定指定的隔離行為,可設定常數為:
TRANSACTION _ UNCOMMITTED: 更新遺失
最低隔離層級,讀取錯誤資料的幾率太高,一般不會採用這種隔離層級。
TRANSACTION _ COMMITTED: 更新遺失+髒讀
交易讀取的資料必須是其他交易已確認的資料
TRANSACTION _ REPEATABLE _ READ: 更新遺失+髒讀+無法重複讀取
讀取交易在確認前不阻止其他讀取交易,,但會阻止其他更新交易。
TRANSACTION _ SERIALIZABLE: 更新遺失+髒讀+無法重複讀取+幻讀 交易時若有資料不一致的疑慮,交易必須可以照順序逐一進行。
4、通過JDBC得知資料庫是否支援某個隔離行為設定,可以通過Connection的getMetaData()取得DatabaseMetadata對象,通過DatabaseMetadata的supportTransaction-IsolationLevel()得知是否支援某個隔離行為。
16.2.6 metadata簡介
Metadata即“詮讀資料的資料”,可以通過connection的getMetaData()方法取得DatabaseMetaData對象,可以取得資料庫整體資訊,而ResultSet表示查詢到的資料,可以通過ResultSet的getMetaData()方法,取得ResultSetMetaData對象。
16.2.7 RowSet簡介
1、javax.sql.RowSet介面,代表資料的列集合。可以對列集合進行增刪改查。通過setCommand()設定查詢指令,通過execute()執行查詢指令以填充資料。
2、RowSet定義了五個標準列集合子介面:
(1)jdbcRowSet
是聯機式的RowSet,保持與資料庫的聯機,可視為取得、操作RowSet的行為封裝。
(2)CacheRowSet
是離線式的RowSet,在查詢並填充完資料後,會斷開與資料來源的聯機
(3)FilteredRowSet
可以對列集合進行過濾,實作類別似SQL中WHERE等條件式的功能。
(4)JoinRowSet
可以讓你結合兩個RowSet對象,可以通過setMatchColumn()指定要結合的行,然後使用addRowSet()來加入RowSet進行結合。
(5)WebRowSet
是CachedRowSet的子介面,不僅具備離線操作,還能進行XM讀寫。
java JDK8 學習筆記第16章
java JDK8 學習筆記——第16章 整合資料庫