1、JDBC是什么?
????????JDBC是Java DataBase Connectivity(Java語言鏈接數據庫)
2、JDBC的本質
????????JDBC是一套接口,有調用者(java工程師)和實現者(SUN公司)(實現類被稱為驅動)之分,跟面向接口調用、面向接口寫實現類,都屬于面向接口編程
- 為什么面向接口?
- 解耦合:降低程序的耦合度,提高程序的擴展力;
3、關系
4、JDBC編程6步
- 第一步:注冊驅動(作用:告訴Java程序,即將要鏈接的是哪個品牌的數據庫)(DriverManager接口)- 第二步:獲取連接(表示JVM的進程與數據庫的進程打開了,這屬于進程之間的通信,使用完后一定要關閉)(Connection接口)- 第三步:獲取數據庫操作對象 (專門執行sql語句的對象)(Statement接口、PreparedStatement接口)- 第四步:執行SQL語句(主要是DML DQL)- DML(數據操作語言): insert、delete、update,對表中的數據進行增刪改- 第五步:處理查詢 結果集(只有第四部執行的是select語句時,這一步才會執行)(ResultSet接口)- 第六步: 釋放資源(使用完之后一定要關閉資源,Java和數據庫屬于進程間的通信,開啟之后一定要關閉)(close)
?5、JDBC事務
- ?什么是事務
- 事務是數據庫提供的一個特性
- 事務:組成各個數據的(最小)執行單元,要么都成功,要么都失敗
- 我們使用一個例子來說明:以轉賬為例
-
* 轉賬的功能,冠希給美美轉1000元錢。 * 使用事務 * 先給冠希扣除掉1000元 * 再給美美加上1000元 * 事務結束了
- ?在MYSQL中操作
-
create table t_account( id int primary key auto_increment, username varchar(20), money double );--兩種方式,第一種:使用命令的方式 start transaction; --開啟事務 update t_account set money = money ‐ 1000 where username = '冠希'; update t_account set money = money + 1000 where username = '美美'; commit; --提供事務(事務已經結束了,數據永久的保存到數據庫中了) rollback; --回滾事務(事務已經結束了,數據回滾到最初始化的狀態)--第二種方式:設置MySQL事務不默認提交的方式 --MySQL數據庫的事務是默認提交的。 update t_account set money = money ‐ 1000 where username = '冠希'; --默認使用了一個事務 --設置讓MySQL的數據庫的事務不默認提交 set autocommit = off或者0 --編寫SQL語句(執行完,都沒有提交) sql1 sql2 --手動提交和回滾 commit; rollback;
-
-
- ?事務的特性
- 原子性
- 表示事務中所有操作是不可再分割的原子單位
- 一致性
- 事務執行前后數據需要保證一致
- 隔離性
- 多個事務同時操作一條記錄,事務之間不能互相干擾
- 持久性
- 事務一旦結束了,數據將永久的保存到數據庫中
- 原子性
- 事務的隔離
- 不考慮隔離性所引發的問題
-
1、臟讀:一個事務讀取到了另一個事務未提交的數據 2、不可重復讀:一個事務讀取到了另一個事務提交的數據,導致了多次查詢的結果不一致。強調的是update,修改記錄的數據。 3、虛度(幻讀):一個事務讀取到了另一個事務提交的數據,導致了多次查詢的結果不一致。強調是insert,向表中添加一條數據。
-
- ?設置隔離級別
- 事務的隔離級別
-
Read uncommitted --讀未提交,什么都解決不了 Read committed --讀已提交,避免臟讀,但是不可重復讀和虛讀有可能產生 Repeatable read --可重復度,避免臟讀和不可重復讀,虛度有可能產生的(mysql默認) Serializable --串行,避免各種讀(當有一個事務的級別達到此時就會上鎖,另一個就不再允許 執行任何修改操作,以此達到避免各種問題的目的)
?
-
- ??4中隔離的安全性和效率
-
安全 Serializable > Repeatable read > Read committed > Read uncommitted 效率 Serializable < Repeatable read < Read committed < Read uncommitted
-
- 事務的隔離級別
- 不考慮隔離性所引發的問題