數據庫設計
簡介
1.軟件的研發步驟
2.數據庫設計概念
>??數據庫設計就是根據業務系統的具體需求,結合我們所選用的DBMS,為這個業務系統構造出最優
的數據存儲模型
>??建立數據庫中的表結構以及表與表之間的關聯關系的過程,
>? 簡單來說就是有哪些表?表里有哪些字段?表和表之間有什么關系?
3.數據庫設計的步驟
① 需求分析? ?(數據是什么?數據具有哪些屬性? 數據與屬性的特點是什么)
② 邏輯分析? (通過ER圖對數據庫進行邏輯建模,不需要考慮我們所選用的數據庫管理系統)
③ 物理設計? (根據數據庫自身的特點把邏輯設計轉換為物理設計)
④ 維護設計? (1.對新的需求進行建表; 2.表優化)
表關系
>??一對一
?如:? 用戶和用戶詳情
( 一對一關系多用于表拆分,將一個實體中經常使用的字段放張表,不經常使用的字段放另一張
表,用于提升查詢性能)
實現方式:在任意一方加入外鍵,關聯另一方主鍵,并且設置外鍵為唯一。
>??一對多(多對一)
?如:? 部門和員工
? ? (一個部門對應多個員工,一個員工對應一個部門)
實現方式:在多的一方建立外鍵,指向一的一方的主鍵。
>??多對多
?如:商品 和 訂單
(一個商品對應多個訂單,一個訂單包含多個商品)
實現方式:建立第三張中間表,中間表至少包含兩個外鍵,分別關聯兩方主鍵。
多表查詢
概念
>? 笛卡爾積:取 A,B集合所有組合情況
>? 多表查詢:從多張表查詢數據。
? ?1.連接查詢:
? ? ? ? ? > 內連接:相當于查詢A 、B交集數據
? ? ? ? ? > 外連接:
? ? ? ? ? ? ? 左外連接:相當于查詢A表所有數據和交集部分數據
? ? ? ? ? ? ? 右外連接:相當于查詢B表所有數據和交集部分數據
? ?2.子查詢
內連接
1.內連接查詢語法
? ? ? ? >? ?隱式內連接
? ? ? ? ?SELECT 字段列表 FROM 表1,表2..WHERE 條件;
? ? ? ? >? ?顯示內連接
? ? ? ? ?SELECT 字段列 表 FROM 表1 [INNER] JOIN 表2 ON 條件;
注:INNER可以省略不寫
外連接
1.外連接查詢語法
? ? ? ? ? ? ? >? 左外連接
? ? SELECT 字段列表 FROM 表1 LEFT [OUTER] J0IN 表2 ON 條件;
? ? ? ? ? ? ? >? 右外連接
? ? SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 條件;
注:OUTER可以省略不寫
子查詢
1.概念:查詢中嵌套查詢,稱嵌套查詢為子查詢。
2.子查詢根據查詢結果不同,作用不同:
? ? ?>? 單行單列:作為條件值,使用= != > <等進行條件判斷
? SELECT 字段列表 FROM 表 WHERE 字段名 = (子查詢);
? ? ?>? 多行單列:作為條件值,使用in 等關鍵字進行條件判斷
? SELECT 字段列表 FROM 表 WHERE 字段名?in (子查詢);
? ? ?>? 多行多列:作為虛擬表
? SELECT 字段列表 FROM (子查詢) WHERE 條件;
事務
簡介
>? 數據庫的事務(Transaction)是一種機制、一個操作序列,包含了一組數據庫操作命令
>? 事務把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組數據庫命令要么同
時成功,要么同時失敗
>? 事務是一個不可分割的工作邏輯單元
> 語法:
? ? ? ? ? -- 開啟事務
START TRANSACTION;? ? 或者? ? BEGIN;
? ? ? ? ? -- 提交事務
COMMIT;
? ? ? ? ? -- 回滾事務
ROLLBACK;
特征
事務四大特征
原子性: 事務是不可分割的最小操作單位,要么同時成功,要么同時失敗
一致性: 事務完成時,必須使所有的數據都保持一致狀態
隔離性: 多個事務之間,操作的可見性
持久性: 事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的
JDBC
簡介
1.JDBC就是使用Java語言操作關系型數據庫的一套API
2.全稱(Java?DataBase Connectivity)? ?Java 數據庫連接。
3.本質:
? ? ? >? 官方(sun公司)定義的一套操作所有關型數據庫的規則,即接口
? ? ? >? 各個數據庫廠商去實現這套接口,提供數據庫驅動jar包
? ? ? >? 我門可以使用這套接口(JDBC)編程,真正執行的代碼是驅動jar包中的實現類
快速入門
JDBC API詳解
DriverManager
DriverManager(驅動管理類)作用:? ?1. 注冊驅動? ? 2. 獲取數據庫連接
1.注冊驅動
Class.forName("com.mysql.jdbc.Driver");
提示:
MySQL5之后的驅動包,可以省略注冊驅動的步驟
自動加載jar包中META-INF/services/java.sql.Driver文件中的驅動類
2.獲取連接
? ? ? static Connection? ? ? ? ?getconnection(strimg url,string uer, string password)
? ? ?> 參數
? 1.url: 連接路徑
? ? ? ? ? ? ? 語法:jdbc:mysql:/ip地址(域名):端口號/數報庫名稱?參數健值對1&參數健值對2...
? ? ? ? ? ? ? 示例:jdbc:mysq!://127.0.0.1:3306/db1
? ? ? ? ? ? ? 細節:
? ? ? ? ? ? ? ? ?>如果連接的是本機mysql服務器,并且mysql服務默認口是3306,則url可以簡寫? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 為:jdbc:mysql:///數據庫名稱?參數鍵值對
? ? ? ? ? ? ? ? >配置 useSSL=false 參數,禁用安全連接方式,解決警告提示
2.user:用戶名
3.password:密碼
Connection
Connection(數據庫連接對象)作用:1. 獲取執行 SQL 的對象? ?2.管理事務
1. 獲取執行 SQL 的對象
? ? ? ? ?>??普通執行SQL對象
? Statement createStatement()
? ? ? ? ?>??預編譯SQL的執行SQL對象:防止SQL注入
? PreparedStatement prepareStatement (sql)
? ? ? ? ?>??執行存儲過程的對象
? CallableStatement prepareCall (sql)
2. 事務管理
>??MySQL 事務管理
? ? ? ? ? ? ? 開啟事務:BEGIN; / STARTTRANSACTION:
? ? ? ? ? ? ? 提交事務:COMMIT;
? ? ? ? ? ? ? 回滾事務:ROLLBACK;
? ?注:MySQL默認自動提交事務
>??JDBC 事務管理: Connection接口中定義了3個對應的方法
? ? ? ? ? ? ? 開啟事務:setAutoCommit(boolean autoCommit):? true為自動提交事務;false為手動提交事
務,即為開啟事務
? ? ? ? ? ? ? 提交事務:commit()
? ? ? ? ? ? ? 回滾事務:rollback()
Statement
Statement作用:? 1. 執行SQL語句
1. 執行SQL語句
? ? ? ?int executeUpdate(sql): 執行DML、DDL語句
? ? ?返回值:(1)DML語句影響的行數
? ? ? ? ? ? ? ? ?(2)DDL添句執行后,執行成功也可能返回0
? ? ? ?ResultSet executeQuery(sql): 執行DQL語句
? ? ?返回值: ResultSet結果集對象
ResultSet
>ResultSet(結果集對象)作用:
? ? ? 1.封裝了DQL查詢語句的結果
ResultSet stmt.executeQuery(sql): 執行DQL語句,返回 ResultSet 對象
>獲取查詢結果
? ? ? ?boolean next():(1)將光標從當前位置向前移動一行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)判斷當前行是否為有效行
? ? ? ?返回值:? true:有效行,當前行有數據
? ? ? ? ? ? ? ? ? ? ? ?false:無效行,當前行沒有數據
? ? ? ?xxx? ?getXxx(參數): 獲取數據
? ? ? ? ? ? ? >? xxx:數 據類型; 如:int getnt(參數);?Sting getSting(參數)
? ? ? ? ? ? ? >?參數:? Int: 列的編號,從1開始
? ? ? ? ? ? ? ? ? ? ? ? ? ?Sting: 列的名稱
>使用步聚:
? ? ? ? ?1.游標向下移動一行,并判斷該行否有數據:next0)
? ? ? ? ?2.獲取數據:getXxx(參數)
//循環判斷游標是否是最后一行末尾
? ? ? ?whlle(rs.next(){
? ? //獲取數據
? ? ? ?rs.getXxx(參數);
}
PreparedStatement
PreparedStatement作用:? 1.預編譯SQL語句并執行: 預防SQL注入問題
注:SQL注入是通過操作輸入來修改事先定義好的SQL語句,用以達到執行代碼對服務器進行攻擊
的方法
1.預編譯SQL并執行SQL語句
>?獲取 PreparedStatement 對象
? ? ? ? //SQL語句中的參數值,使用?占位符替代
String sql = "select * from user where usemame = ? and password = ?";
? ? ? ?//通過Connection對象獲取,并傳入對應的sql語句
PreparedSlatement pstmt = conn.prepareSlatement(sql);
>?設置參數值
PreparedStatement對象:setXxx(參數1,參數2):給?賦
? ?>?Xxx:數據類型;? 如 setlnt(參數1,參數2)
? ?>?參數:
? ? ? ? ? ? ? 參數1: ? 的位置編號,從1開始
? ? ? ? ? ? ? 參數2: ? 的值
>?執行SQL
executeUpdate():/ executeQuery(); : 不需要再傳遞sql
2.PreparedStatement 原理
在獲取PreparedStatement對像時,將sgl語句發送給mysql服務器,進行檢查,編譯(這些步票很耗時)
執行時就不用再進行這些步票了,速度更快
如果sgl模板一樣,則只需要進行一次檢查、編譯