事務(wù)處理
JDBC中,事務(wù)是自動提交的。每執(zhí)行一次DML就提交一次事務(wù)。
事務(wù)特性:
- 原子性(Atomicity):事務(wù)必須是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行
- 一致性(Consistency):事務(wù)在完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)
- 隔離性(Isolation ):由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離
- 持久性(Durability):事務(wù),它對于系統(tǒng)的影響是永久性的
事務(wù)是數(shù)據(jù)庫的概念,JDBC支持事務(wù),本質(zhì)還是在數(shù)據(jù)庫中實現(xiàn)的
事務(wù)相關(guān)API
相關(guān)API:
- Connection.getAutoCommit():獲得當(dāng)前事務(wù)的提交方式,默認為true
- Connection.setAutoCommit():設(shè)置事務(wù)的提交屬性,參數(shù)是true :自動提交:false :不自動提交
- Connection.commit():提交事務(wù)
- Connection.rollback():回滾事務(wù)
批量處理
批量處理可以減少IO,提高效率
批量更新API
- addBatch(String sql)
Statement類的方法,可以將多條sql語句添加Statement 對象的SQL語句列表中 - addBatch()
PreparedStatement類的方法,可以將多條預(yù)編譯的sql語句添加到PreparedStatement對象的SQL語句列表中 - executeBatch()
把Statement對象或PreparedStatement對象語句列表中 的所有SQL語句發(fā)送給數(shù)據(jù)庫進碰理 - clearBatch()
清空當(dāng)前SQL語句列表
防止OutOfMemory
如果PreparedStatement對象中的SQL列表包含過多的待處理SQL語句,可能會產(chǎn)生OutOfMemory錯誤,及時處理SQL語句列表。
返回自動主鍵
利用PreparedStatement的getGeneratedKeys方法獲取自增類型的數(shù)據(jù),性能良好,只要一次SQL交互:
PreparedStatement preparedStatement = connection.prepareStatement(sql, new String[]{"deptno"});
preparedStatement.executeUpdate();
resultSet.next()
int id = resultSet.getInt(1);
分頁
分頁可以分為兩種策略,一種是直接用數(shù)據(jù)庫的分頁來進行,另一種可以基于緩存的分頁技術(shù),一次性全部取出數(shù)據(jù),然后程序內(nèi)進行分頁
DAO
DAO (Data Access Object)數(shù)據(jù)訪問對象
建立在數(shù)據(jù)庫和業(yè)務(wù)層之間,封裝所有對數(shù)據(jù)庫的訪問。將數(shù)據(jù)庫的一條數(shù)據(jù)映射為java中的一個對象
目的:數(shù)據(jù)訪問邏輯和業(yè)務(wù)邏輯分開,使得操作對象就可以完成對數(shù)據(jù)庫數(shù)據(jù)的修改。
DAO通常包括:
- 一個DAO工廠類
- 一個DAO接口
- 一個實現(xiàn)DAO接口的具體類
- 數(shù)據(jù)傳遞對象(實現(xiàn)對象或值對象)
實體對象
DAO層需要定義對數(shù)據(jù)庫中表的訪問
實體類就是java中的一個類,用于描述數(shù)據(jù)庫中的一張表,每一個實例代表數(shù)據(jù)庫中的一個數(shù)據(jù)。實體類的用途就是描述對象和數(shù)據(jù)表之間的映射。
- 表和類對應(yīng)
- 表中的字段和類的屬性對應(yīng)
- 記錄和對象對應(yīng)
異常處理機制
多層系統(tǒng)的異常處理原則:
- 誰拋出的異常,誰捕捉處理,因為只有異常拋出者,知道怎樣捕捉處理異常;
- 盡量在當(dāng)前層中捕捉處理拋出的異常,盡置不要拋出到上層接口;
- 盡量在每層中封裝每層的異常類,這樣可準確定位異常拋出的層;
- 如異常無法捕捉處理,則向上層接口拋出,直至拋給JVM;
- 應(yīng)盡量避免將異常拋給JVM