02 MySQL資料庫、SQL、資料庫設計、事務、JDBC
1. MySQL 資料庫
1.1 MySQL 的安裝:
包含兩種安裝方式,解壓包安裝、壓縮包安裝。
透過解壓包安裝:
下載壓縮包後進行解壓、新增 my.ini 初始化配置檔案、新增環境變數;
新增 mysqld 服務、啟動該服務。
期間遇到的一些問題和解決方案:
- 找不到dll檔案,導致安裝失敗。是因為c++資源庫裡少了一個資原始檔,可以透過安裝對應c++資源庫或dll修復解決;
- 初始化配置檔案裡utf8 寫成 utf-8,會報錯找不到對應字符集;
- 初始化配置檔案裡一些引數值隨著版本升級不再適用,可直接刪除;
- 無法正常啟動 mysqld服務,可能是因為環境變數的路徑新增錯誤。在工作管理員-服務裡,找到mysql服務詳情的路徑資訊進行檢查,該路徑預設使用登錄檔裡的路徑,如果與實際sqld.exe檔案位置不一致,更改登錄檔裡的地址;
【data】目錄下的三個自帶資料庫:
- mysql: 存放最為核心的一些資訊,比如許可權、安全等
- performance_schema:儲存效能相關資訊
- sys:儲存系統相關資訊
一般客戶端不對這三個進行改動
1.2 MySQL資料模型
MySQL是一種關係型資料庫,關係型資料庫是由多張能相互連線的二維表組成的資料庫;
簡單來說,透過表來儲存資料的資料庫,就稱為 關係型資料庫。(不透過表的,非關係型資料庫);
其實 一個資料庫在電腦上對應的就是data目錄下的一個資料夾
2. SQL簡介
Structured Query Language,結構化查詢語言,定義操作所有關係型資料庫的統一標準
對於同一個需求,每一種資料庫操作的方式可能會存在一些不一樣的地方,稱之為“方言”
- where 和 having 的區別
- 執行時機不一樣,where 是分組之前進行限定,不滿足 where 條件,則不參與分組,而 having 是分組之後堆結果進行過濾
- 可判斷的條件不一樣:where 不能對聚合函式進行判斷,having 可以
3. 資料庫設計
-
一對多 表關係(一個部門對應多個員工)
實現方式:在 多 的一方建立外來鍵,指向 一 的一方 -
多對多 表關係(一個商品對應多個訂單,一個訂單包含多個商品)
實現方式:建立第三張表,中間表,中間表至少包含 兩個外來鍵,分別關聯兩方主鍵
(通常也會加一些業務欄位進去) -
一對一 表關係(使用者 和 使用者詳情)
一對一關係多用於表拆分,將一個實體中經常使用的欄位放一張表,不經常使用的欄位放另一張表,用於提升查詢效能 ——> 使用者表+使用者詳情表
實現方式:在任意一方加入外來鍵,關聯另一方主鍵,並且設定外來鍵為唯一(UNIQUE)
4. 事務
4.1 簡介
資料庫的事務(transaction)是一種機制、一個操作序列,包含了一組資料庫操作命令
事務把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組資料庫命令要麼同時成功,要麼同時失敗
事務是一個不可分割的工作邏輯單元
開啟事務
BEGIN/START
提交事務
COMMIT
4.2 事務四大特徵
Atomicity:原子性,事務時不可分割的最小操作單位,要麼同時成功,要麼同時失敗
Consistency:一致性,事務完成時,必須使所有的資料都保持一致狀態
Isolation:隔離性,多個事務之間,操作的可見性
Durability:永續性,事務一旦提交或回滾,它對資料庫中的資料的改變就是永久的
5. JDBC
5.1 簡介
JDBC,Java DataBase Connectivity,Java資料庫連線,就是使用 Java語言操作關係型資料庫的一套API
IDEA新增對應jar包:
官網下載jar包,放入專案目錄下,右鍵-新增至lib,才能被專案內程式碼識別。
使用Java運算元據庫步驟:
5.2 JDBC API詳解
5.2.1 DriverManager類
驅動管理類作用:
- 註冊驅動
Class.forName("com.mysql.jdbd.Driver")
MySQL 5之後的驅動包,可以省略註冊驅動的步驟
自動載入jar包中META-INF/services/java.sql.Driver檔案中的驅動類
- 獲取資料庫連線
static Connection getConnection(String url, String user, String password)
url語法:jdbc:mysql://ip地址(域名):埠號/資料庫名稱?引數鍵值對1&引數鍵值對2...
url示例:jdbc:mysql://127.0.0.1:3306/db1
配置 useSSL=false引數,禁用安全連線,解決警告提示(jdbc:mysql://127.0.0.1:3306/db1?useSSL=false)
5.2.2 Connection
資料庫連線類作用:
- 獲取執行sql物件
普通執行sql物件
Statement createStatement()
預編譯sql的執行sql物件:防止sql注入
PreparedStatement prepareStatement(sql)
執行儲存過程的物件
CallableStatement prepareCall(sql)
- 事務管理
5.2.3 Statement
作用:
- 執行sql語句
5.2.4 ResultSet
結果集物件作用:
- 封裝了DQL查詢語句的結果
Result stmt.executeQuery(sql) # 執行DQL語句,返回ResultSet物件
- 獲取查詢結果
boolean next() # 將游標從當前位置向前移動一行;判斷當前行是否為有效行
xxx getXxx(引數) # 獲取引數; 引數型別:int列的編號(從1開始)、String列的名稱
5.2.5 PreparedStatement
作用:
- 預編譯sql語句並執行:預防sql注入問題
sql注入:是指透過操作輸入來修改事先定義好的sql語句,用以達到執行程式碼對伺服器進行攻擊的方法
5.3 資料庫連線池
5.3.1 簡介
- 資料庫連線池是個容器,負責分配、管理資料庫連線
- 它允許應用程式重複使用一個現有的資料庫連線,而不是再重新建立一個
- 釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏
- 好處:
資源重用;
提升系統響應速度;
避免資料庫連線遺漏;