日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL-JDBC

發布時間:2023/12/10 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL-JDBC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.初識MySQL

JavaEE:企業級Java開發 Web

前端(頁面,展示,數據!)

后臺(連接點:連接數據庫JDBC,連接前端(控制,控制視圖跳轉,和給前端傳遞數據)

數據庫(存數據,Txt …)

1.1 為什么學習數據庫

數據庫是所有軟件體系中最核心的存在 DBA

1.2什么是數據庫

數據庫 (DB ,DataBase)

概念:數據倉庫,軟件,安裝在操作系統上

作用:存儲數據,管理數據

1.3 數據庫分類

? 關系型數據庫

  • Mysql ,Oracle ,Sql Server ,

  • 通過表和表之間,行和列之間的關系進行數據的存儲

    非關系型數據庫

    • Redis ,MongDB
    • 非關系型數據庫,對象存儲,通過對象的自身的屬性來決定

DBMC(數據庫管理系統)

  • 數據庫的管理軟件,科學有效的管理我們的數據,維護和獲取數據
  • Mysql ,數據庫管理系統

1.4連接數據庫

命令行連接

show databases; -- 查看所有的數據庫 use 數據庫名稱 ; --切換數據庫 show tables; -- 查看數據庫中所有的表 describe student; --查看數據庫中所有的表的信息 create database 數據庫名稱; --創建一個數據庫0 exit; --退出連接 -- 單行注釋 (SQL 的本來的注釋)

數據庫xxx語言 CRUD增刪改查!

DDL 定義

DML 操作

DQL 查詢

DCL 控制

2.操作數據庫

操作數據庫 > 操作數據庫中的表 > 操作數據庫表中的數據

2.1操作數據庫

1.創建數據庫

create database [if not exists] 數據庫名稱;

2.刪除數據庫

drop database [if exists] 數據庫名稱;

3.使用數據庫

如果你的表名或者字段名是一個特殊的字符,就需要帶 `` use `數據庫名稱`

4.查看數據庫

show databases -- 查看所有的數據庫

2.2數據庫的列類型

數值

  • tinyint 十分小的數據 1個字節
  • smallint 較小的數據 2個字節
  • mediumint 中等大小的數據 3個字節
  • int 標準的整數 4個字節
  • bigint 較大的數據 8個字節
  • float 浮點數 4個字節
  • double 浮點數 8個字節
  • decimal 字符串形式的浮點數

字符串

  • char 字符串固定大小的 0~255
  • varchar 可變字符串 0~65535 常用的 String
  • tinytext 微型文本 2^8 -1
  • text 文本串 2^16-1 大文本

時間日期

  • date YYYY-MM-DD 日期
  • HH:mm:ss 時間格式
  • datetime YYYY-MM-DD HH:mm:ss 最常用的時間格式
  • timestamp 時間戳
  • year 年份表示

null

  • 沒有值 ,未知
  • 不要使用NULL進行運算,結果為null

2.3 數據庫的字段屬性

Unsigned:

  • 無符號的整數

  • 聲明了該列不能聲明為負數

zerofill:

  • 0填充的

  • 不足的位數,使用0填充,int(3), 5 —…

子增

  • 通常理解為自增,主動在一條記錄的基礎上+1 (默認)
  • 通常用來設計唯一的主鍵~ index,必須是整數類型
  • 可以自定義設計主鍵自增的起始值和步長

非空 Null not null

  • 假設設置為 not null ,如果不給它賦值,就會報錯

  • NUll ,如果不填寫值,默認就是nul!

默認:

  • 設置默認的值!
  • sex

2.4 創建數據庫表

CREATE TABLE IF NOT EXISTS `studen` (`id` INT (4) NOT NULL AUTO_INCREMENT COMMENT '學號', `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',`pwd` VARCHAR(20)NOT NULL DEFAULT '123456' COMMENT '密碼', `sex` VARCHAR(2) NOT NULL DEFAULT '女'COMMENT '性別',`birthady` DATETIME DEFAULT NULL COMMENT '出生日期', `address`VARCHAR(100) DEFAULT NULL COMMENT '家庭住址', `email` VARCHAR (50) DEFAULT NULL COMMENT '郵箱', PRIMARY KEY (`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8

格式

create table [if not exists] `表名` ('字段名' 列類型 [屬性] [索引] [注釋],'字段名' 列類型 [屬性] [索引] [注釋],......'字段名' 列類型 [屬性] [索引] [注釋] )[表類型][字符集設置][注釋]

常用命令

SHOW CREATE DATABASE school --查看創建數據庫的語句 SHOW CREATE TABLE student --查看student數據表的定義語句 DESC student --顯示表的結構

2.5 數據表的類型

--關于數據庫引擎 innodb 默認使用 myisam 早些年使用的 MYSIAMINNODB
事務支持不支持支持
數據行鎖定不支持支持
外鍵約束不支持支持
全文索引支持不支持
表空間的大小較小較大,約為2倍

常規使用操作:

  • MYISAM 節約空間,速度較快

  • INNODB 安全性高 ,事務的處理 , 多表用戶操作

在物理空間存在的位置

所有的數據庫文件都存在data目錄下

本質還是文件的存儲!

mysql引擎在物理文件上的區別

  • innoDB 在數據庫表中只有一個*.frm文件,以及上級目錄下的ibdata1文件

  • MYISAM 文件

    • *.frm -表結構的定義文件
    • *.MYD 數據文件(data)
    • *.MYI 索引文件 (index)

設置數據庫表的字符集編碼

CHARSET=utf8

不設置的話,會是mysql默認的字符集編碼~(不支持中文)

mysql的默認編碼是Latin1,不支持中文

在my.ini中配置默認的編碼

character-set-server=utf8

2.6修改刪除表

修改

--修改表名 alter table 舊表名 rename as 新表名 alter table teacher rename as techer1 -- 增加表的字段 alter table 表名 add 字段名 列屬性 alter table teacher1 add age int(11) --修改表的字段(重命名,修改約束!) -- alter table 表名 modify 字段名 列屬性 [] alter table teacher1 modify age varchar(11) --修改約束 -- alter table 表名 change 舊名稱 新名稱 列屬性 [] alter table teacher1 change age age1 int(1) --字段重命名 --刪除表的字段 alter table teacher1 drop age1

刪除

-- 刪除表 (如果表存在再刪除) -- drop table if exists 表名稱 drop table if exists teacher1

所有的創建和刪除操作盡量加上判斷,以免報錯~

注意點

  • `` 字段名,使用這個包裹!

  • 注釋 – /**/

  • sql關鍵字大小寫不敏感

  • 所有的符號全部英文

3.MYSQL的數據管理

3.1 外鍵

方式一,在創建表的時候,增加約束

CREATE TABLE IF NOT EXISTS `student` ( `id`INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號', `name` VARCHAR(30)NOT NULL DEFAULT '匿名'COMMENT '姓名', `pwd` VARCHAR(20)NOT NULL DEFAULT '123456'COMMENT '密碼', `sex` VARCHAR(2)NOT NULL DEFAULT '女' COMMENT '性別', `birthday` DATETIME DEFAULT NULL COMMENT '出生日期', `gradeid` INT(10) NOT NULL COMMENT '學生的年級', `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址', `email` VARCHAR (50) DEFAULT NULL COMMENT '郵箱', PRIMARY KEY(`id`), KEY `fk_gradeid` (`gradeid`), CONSTRAINT `fk_gradeid` FOREIGN KEY (`hradeid`) REFERENCES `grade`(`gradeid`) )ENGINE=INNODB DEFAULT CHARSET=utf8

刪除有外鍵關系的表的時候,必須要先刪除引用別人的表(從表),在刪除被引用的表(主表)。

方式二:創建表成功后,添加外鍵約束

-- 創建表的時候沒有外鍵關系 alter table 表名 add constraint 約束名 foreign key (作為外鍵的列) references 哪個表(哪個字段)

以上操作都是物理外鍵,數據庫級別的外鍵,不建議使用

最佳實踐

  • 數據庫就是單純的表,只用來存數據,只有行(數據)和列(字段)

  • 我們想使用多張表的數據,想使用外鍵(程序去實現)

3.2 DML語言

數據庫意義:數據存儲,數據管理

DML語言:數據操作語言

  • insert
  • update
  • delete

3.3 添加

insert

-- 插入語句(添加) -- insert into 表名([字段名1,字段2,字段3])values ('值1'),('值2'),('值3') insert into `grade`(`gradenaem`) value ('大四')-- 由于主鍵自增我們可省略(如果不寫表的字段,他就會一一匹配) insert into 'grade' value('大三')-- 一般寫插入語句,我們一定要數據和字段一一對應!

語法: insert into 表名([字段名1,字段2 ,字段3])value (‘值1’),(‘值2’), (‘值3’,…)

注意事項:

1.字段和字段之間使用逗號隔開

2.字段是可以省略的,但是后面的值必須要一一對應 ,不能少

3.可以同時插入多條數據,VALUES后面的值,需要使用,隔開即可 VALUES (), (), …

3.4 修改

UPDATE 修改誰 (條件) set 原來的值= 新值

-- 語法: -- update 表名 set colnum_name = value , [colnum_name = value,......] where [條件]

條件: where 子句 運算符 id等于某個值,大于某個值 ,在某個區間內修改 …

操作符會返回布爾值

操作符含義范圍結果
=等于5=6false
<> 或! =不等于5<>6true
>
<
<=
>=
BETWEEN … and …在某個范圍內[2,5]
AND我和你5.1 and 1>2false
OR我或你||5>1 or 1>2true
-- 通過多個條件定位數據 語法: update 表名 set colnum_name = value ,[colnum_name= value, ...]where [條件]

注意:

  • colnum_name 是數據庫的列,盡量帶上``
  • 條件,篩選的條件,如果沒有指定,則會修改所有的列
  • value, 是一個具體的值,也可以是一個變量
  • 多個設置的屬性之間,使用英文逗號隔開
例: update `student ` set `birthday`=current_time where `name` ='長江七號' and sex='女'

3.5 刪除

delete 命令

語法:delete from 表名 [where 條件]

-- 刪除數據 (避免這樣寫,會全部刪除) delete from `student`-- 刪除指定數據 delete from `student` where id = 1;

TRUNCATE 命令

作用:完全清空一個數據庫表,表的結構和索引約束不會變!

-- 清空 student 表 TRUNCATE `student`

delete 的 TRUNCATE區別

  • 相同點:都能刪除數據庫,都不會刪除表結構
  • 不同:
    • TRUNCATE 重新設置 自增列計數器會歸零
    • TRUNCATE 不會影響事務

DELETE刪除的問題:,重啟數據庫,現象

  • InnoDB 自增列會從1開始 (存在內存當中的,斷電即失)
  • MyISAM 繼續從上一個子增量開始

4.DQL 查詢數據

4.1 DQL

(Data Query LANGUAGE: 數據查詢語言)

  • 所有的操作都用它 Select

  • 簡單的查詢,復雜的查詢它都能做

  • 數據庫最核心的語言,最重要的語句

  • 使用頻率最高的語句

select 完整的語法:

select 語法

select [all | distinct][left |right |inner join ][where ...] ---- 指定結果需要滿足的條件[group by ...] ---- 指定結果按照哪幾個字段來分組[having ] ---- 過濾分組的記錄必須滿足得到次要條件[order by ] ---- 指定查詢記錄按一個或多個條件排序[limit] ---- 指定查詢的記錄從哪條至哪條

4.2 指定查詢字段

-- 查詢全部的學生 select 字段 from 表 select * from student-- 查詢指定字段 select `student`, `Studentname` from student-- 別名 ,給結果起一個名字 AS 可以給字段起別名,也可以給表起別名 select `student` as 學號 , `strudentname` as 學生姓名 from student AS s-- 函數 Concat(a,b)qq select concat ('姓名:' StudentName) AS 新名字 FROM student

語法: select 字段, … from 表

有的時候,列名字不是那么的見名知意。我們起別名 AS 字段名 as 別名 表名 as 別名

去重 distinct

作用:去除select查詢出來的結果中重復的數據,重復的數據只顯示一條

-- 查詢一下有哪些同學參加了考試,成績 select * from result -- 查詢全部的考試成績 select `studentNo` from result -- 查詢全部的考試成績 select distinct `studentNo` from result -- 發現重復數據,去重

數據庫的列(表達式)

select version() --查詢系統版本 select 100*3-1 AS 計算結果 -- 用來計算(表達式) select @@auto_increment_increment -- 查詢自增的步長 (變量)-- 學員考試成績 +1 分查看 select `StudentNo` ,`StudentResult` +1 AS '提分后' FROM result

數據庫中的表達式:文本值,列,Null,函數,計算表達式,系統變量 …

select 表達式 from 表

4.3 where 條件子句

作用: 檢索數據中符合條件的值

搜索的條件由一個或者多個表達式組成!

邏輯運算符

運算符語法描述
and &&a and b a&&b邏輯與,兩個都為真,結果為真
or ||a or b a||b邏輯或,其中一個為真,則結果為真
Not !not a !a邏輯非,真為假,假為真

模糊查詢:比較運算符

運算符語法描述
IS BULLa is null如果操作符為Null,結果為真
IS NOT NULLa is not null如果操作符為Not null ,結果為真
BETWEENa between b and c若a在b和c之間,則結果為真
Likea like bSQL匹配,如果a匹配b,則結果為真
lna in (a1,a2,a3 …)假設a1,或者a2… 其中的某一個值中,結果為真

4.4 聯表查詢

Join 對比

操作描述
inner join如果表中至少有一個匹配,就返回行
left join會從左表中返回所有的值,即使右表沒有匹配
right join會從右表中返回所有的值,即使左表中沒有匹配
-- from a left join b -- from a right join b

自連接

自己的表和自己的表連接,核心:一張表拆成兩張一樣的表即可

4.5 分頁和排序

排序

-- 排序: 升序ASC , 降序 DESC -- ORDER BY 通過哪個字段字段排序

分頁

-- [pageSize] 頁面大小-- [(n-1)*pageSize] 起始值-- [n: ] 當前頁面-- [數據總數/頁面大小=總頁數]

語法:limit(查詢起始下標,pageSize)

4.6 子查詢

where (這個值是計算出來的)

本質: 在where語句中嵌套一個子查詢語句

4.7 分組和過濾

-- 查詢不同課程的平均分,最高分,最低分 -- 核心:(根據不同的課程分組) SELECT SubjectName,AVG(StudentResult),MAX (StudentResult),MIN (StudentResult) FROM result r INNER JOIN `subject` sub ON r. `StudentNo` =sub.`StudentNo` GROUP BY r.SubjectNo -- 通過什么字段來分組 HAVING 平均分>80

5. MYSQL 函數

5.1 常用函數

-- 字符串函數 SELECT CHAR_LENGTH('即使再小的帆也能遠航') -- 字符串長度 SELECT CONCAT ('即使','再小','的帆') -- 拼接字符串 SELECT INSERT ('撥開云霧',1,2,'見明日') -- 查詢,從某個位置開始替換 SELECT LOWER ('AAaa') -- 小寫字母 SELECT UPPER ('AAAA') -- 大寫字母 SELECT INSTR ('abcde','a') -- 返回第一次出現的字符串的索引 SELECT REPLACE ('即使再小的帆也能遠航','即使','遠航') -- 替換出現的指定字符串 SELECT SUBSTR ('即使再小的帆也能遠航',4,6) -- 返回指定的字符串 SELECT REVERSE ('即使再小') -- 反轉 -- 查詢姓 周的同學, 名字 州 SELECT REPLACE (Studentname,'周','州') FROM student WHERE studentname LIKE '周%'-- 時間和日期函數 SELECT CURRENT_DATE() -- 獲取當前日期 SELECT CURDATE() -- 獲取當前日期 SELECT NOW() -- 獲取當前的時間 SELECT LOCALTIME () -- 本地時間 SELECT SYSDATE() -- 系統時間SELECT YEAR(NOW()) -- 年 SELECT MONTH(NOW()) -- 月 SELECT DAY(NOW()) -- 日 SELECT HOUR(NOW()) -- 時 SELECT MINUTE(NOW()) -- 分 SELECT SECOND(NOW()) -- 秒-- 系統 SELECT SYSTEM_USER() SELECT USER() SELECT VERSION()

5.2 聚合函數(常用)

函數名稱描述
COUNT ( )計數
SUM ()求和
AVG ()平均值
MAX ()最大值
MIN ()最小值
-- 聚合函數 -- 都能夠統計 表中的數據 (想查詢一個表中有多少個記錄,就使用這個count()) SELECT COUNT(`BornDate`) FROM student; -- Count(字段),會忽略所有的null值 SELECT COUNT(*) FROM student; -- Count(*),不會忽略null值,本質 計算行數 SELECT COUNT(1) FROM result; -- Count(1),不會忽略所有的null值 本質 計算行數SELECT SUM(`StudentResult`) AS 總和 FROM result SELECT AVG(`StudentResult`) AS 平均分 FROM result SELECT MAX(`StudentResult`) AS 最高分 FROM result SELECT MIN(`StudentResult`) AS 最低分 FROM result

?

5.3 數據庫級別的MD5加密

什么是MD5

主要增強算法的復雜度和不可逆性

MD5不可逆,具體的值的MD5是一樣的

MD5破解網站的原理,背后有一個字典,MD5加密后的值,加密的前值

-- 測試MD5加密 CREATE TABLE `testmd5`( `id`INT (4) NOT NULL, `name` VARCHAR (20)NOT NULL, `pwd` VARCHAR(50) NOT NULL, PRIMARY KEY(`id`) )ENGINE = INNODB DEFAULT CHARSET=uft-8-- 明文密碼 INSERT INTO sestmd5 VALUES (1,'zhangsan','123456'),(2,'lisi','123456'),(3,'wangwu','123456')-- 加密 UPDATE testmd5 SET pwd=MD5(pwd) WHERE id =1 UPDATE testmd5 SET pwd=MD5(pwd) -- 加密全部的密碼-- 插入的時候加密 INSERT INTO testmd5 VALUES(4,'xiaoming',MD5('123456'))-- 如何校驗 :將用戶傳遞過來的密碼,進行MD5加密,然后對比加密后的值 SELECT * FROM testmd5 WHERE `name`='xiaoming' AND pwd=MD5('123456')

6.事務

6.1 什么是事務

要么都成功,要么都失敗

事務原則:ACID原則 原子性 ,一致性 , 隔離性 , 持久性 (臟讀,幻讀…)

原子性(Atomicity)

要么都成功,要么都失敗

一致性(Consistency)

事務前后的數據完整性要保持一致

持久性(Durability)–事務提交

事務一旦提交則不可逆,被持久化到數據庫中!

隔離性(Isolation)

事物的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,事物之間要相互隔離

隔離所導致的一些問題

臟讀:

指一個事務讀取了另外一個事務未提交的數據。

不可重復讀:

在一個事務內讀取表中的某一行數據,多次讀取結果不同。(這個不一定是錯誤的,只是某些場合不對)

虛讀(幻讀):

是指在一個事務內讀取到了別人的事務插入的數據,導致前后讀取不一致

-- 事務 -- mysql是默認開啟事務自動提交的 SET autocommit = 0 /*關閉*/ SET autocommit = 1 /* 開啟(默認的)*/-- 手動處理事務-- 事務開啟 START TRANSACTION -- 標記一個事務的開始,從這個之后的sql都在同一個事務內INSERT xx INSERT xx-- 提交:持久化(成功!) COMMIT -- 回滾: 回到原來的樣子 (失敗!) ROLLBACK -- 事務結束 SET autocommit = 1 -- 開啟自動提交-- 了解 SAVEPOINT 保存點名 -- 設置一個事務的保存點 ROLLBACK TO SAVEPOINT 保存點名 -- 回滾到保存點 RELEASE SAVEPOINT 保存點名 -- 撤銷保存點

模擬場景

-- 轉賬 CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci USE shop CREATE TABLE `account`( `id` INT(3) NOT NULL AUTO_INCREMENT, `name` VARCHAR(30) NOT NULL, `money`DECIMAL(9,2)NOT NULL, PRIMARY KEY (`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO ACCOUNT(`name`,`money`) VALUES ('A',2000.00),('B',10000.00)-- 模擬轉賬:事務 SET autocommit = 0; -- 關閉自動提交 START TRANSACTION -- 開啟一個事務 (一組事務)UPDATE ACCOUNT SET money=money-500 WHERE `name` = 'A' -- A減500 UPDATE ACCOUNT SET money=money+500 WHERE `name` = 'B' -- A加500COMMIT; -- 提交事務,就被持久化了 ROLLBACK; -- 回滾SET autocommit = 1; -- 恢復默認值

7. 索引

mysql 官方對索引的定義為:索引(Index)是幫助mysql高效獲取數據的數據結構

提取句子主干,就可以得到索引的本質:索引是數據結構

7.1 索引的分類

  • 主鍵索引 (PRIMARY KEY)
    • 唯一的標識,主鍵不可重復,只能有一個列作為主鍵
  • 唯一索引 (UNIQUE KEY)
    • 避免重復的列出現,唯一的索引可以重復,多個列都可以標識為唯一索引
  • 常規索引 (KEY/Index)
    • 默認的,index 。key關鍵字來設置
  • 全文索引 (FullText)
    • 在特定的數據庫引擎下才有,MylSAM
    • 快速定位數據
-- 索引的使用 -- 1.在創建表的時候給字段添加索引 -- 2.在創建完畢后,增加索引-- 顯示所有的索引信息 SHOW INDEX FROM student-- 增加一個全文索引(索引名) 列名 ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`studentName`)-- EXPLAIN 分析sql執行的狀況 EXPLAIN SELECT * FROM student; -- 非全文索引EXPLAIN SELECT * FROM student WHERE MATCH(studentName)AGAINST('劉');

7.2 測試索引

索引在小數據量的時候,用戶不大,但是在大數據的時候,區別十分明顯

7.3 索引原則

  • 索引不是越多越好

  • 不要對進程變動數據加索引

  • 小數據量的表不需要加索引

  • 索引一般加在常用來查詢的字段上!

索引的數據結構

Hash類型的索引

Btree:InnoDB的默認數據結構

8. 權限管理和備份

8.1 用戶管理

-- 創建用戶 create user 用戶名 identified by '密碼' CREATE USER zzz IDENTIFIED BY '123456'-- 修改密碼(修改當前用戶密碼) SET PASSWORD = PASSWORD('123456')-- 修改密碼 (修改指定用戶密碼) SET PASSWORD FOR zzz =PASSWORD('123456')-- 重命名 rename user 原來名字 to 新的名字 RENAME USER zzz TO zaa-- 用戶授權 all privileges 全部權限 ,庫,表 -- all privileges 除了給別人授權,其他都能干 GRANT ALL PRIVILEGES ON *.* TO zzz-- 查詢權限 SHOW GRANTS FOR zzz -- 查看指定用戶的權限 SHOW greate FOR root@localhost-- root 用戶權限 :grant all privileges on *.* to 'root'@'localhost' with grant option-- 撤銷權限 revoke 哪些權限 ,在哪個庫撤銷,給誰撤銷 REVOKE ALL PRIVILEGES ON *.* FROM zzz -- 刪除用戶 DROP USER zzz

8.2 MYSQL備份

為什么要備份:

  • 保證重要的數據不丟失
  • 數據轉移

mysql數據庫備份的方式

  • 直接拷貝物理文件

  • 在Sqlyog這種可視化工具手動導出

  • 使用命令行導出 Mysqldump 命令行使用

    mysqldump -h主機 -u用戶名 -p密碼 數據庫 表名 >物理磁盤的位置/文件名導入 source 備份文件

9 . 規范數據庫設計

9.1 為什么需要設計

當數據庫比較復雜的時候,我們就需要設計了

糟糕的數據庫設計:

  • 數據冗余,浪費空間
  • 數據庫插入和刪除都會麻煩,異常【屏蔽使用物理外鍵】
  • 程序的性能差

良好的數據庫設計:

  • 節省內存空間
  • 保證數據庫的完整性
  • 方便我們開發系統

軟件開發中,關于數據庫的設計

  • 分析需求:分析業務和需要處理的數據庫的需求
  • 概要設計:設計關系圖E-R圖

設計數據庫的步驟:(個人博客)

  • 收集信息,分析需求
    • 用戶表(用戶登錄注銷)
    • 分類表
    • 文章表
    • 友鏈表
    • 自定義表
  • 標識實體

  • 標識實體之間的關系

9.2 三大范式

為什么需要數據規范化?

  • 信息重復

  • 更新異常

  • 插入異常

    • 無法正常顯示信息
  • 刪除異常

    • 丟失有效的信息

三大范式

第一范式(1NF)

原子性:保證每一列不可再分

第二范式(2NF)

前提:滿足第一范式

每張表只描述一件事情

第三范式(3NF)

前提:滿足第一范式和第二范式

第三范式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關

(規范數據庫的設計)

規范性和性能的問題

關聯查詢的表不得超過三張表

  • 考慮商業化的需求和目標,(成本,用戶體驗)數據庫的性能更加重要
  • 在規范性能的問題的時候,需要適當的考慮一下規范性!
  • 故意給某些表增加一些冗余的字段(從多表查詢變為單表查詢)

10.JDBC(重點)

10.1 數據庫驅動

驅動:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QjMCMgyg-1649757823743)(C:\Users\27223\AppData\Roaming\Typora\typora-user-images\image-20220409084111503.png)]

我們的程序會通過數據庫驅動和數據庫打交道!

10.2 JDBC

SUN公司為了簡化開發人員的操作,提供了一個(java操作數據庫的)規范,俗稱JDBC

這些規范的實現由具體的廠商去做

對于開發人員來說,我們只需要掌握JDBC接口的操作即可!

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QPH8IvtH-1649757823744)(C:\Users\27223\AppData\Roaming\Typora\typora-user-images\image-20220409084541574.png)]

java.sql

javax.sql

還需要導入一個數據庫驅動包 mysql-connector-java-5.1.47.jar

10.3 第一個JDBC程序

導入測試數據庫

package h1.p1;import java.sql.*;public class JdbcFirstDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1. 加載驅動Class.forName("com.mysql.jdbc.Driver");// 2. 用戶信息和urlString url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSl=true";String username = "root";String password ="root";// 3. 連接成功,數據庫對象 Connection 代表數據庫Connection connection = DriverManager.getConnection(url,username,password);// 4.執行sql的對象去執行sql 可能存在結果,查看返回結果Statement statement = connection.createStatement();// 5. 執行sql的對象去執行sql,可能存在結果,查看返回結果String sql ="select * from users";ResultSet resultSet= statement.executeQuery(sql); //返回的結果集while(resultSet.next()){System.out.println("id"+resultSet.getObject("id"));}resultSet.close();} }

步驟總環:

? 1.加載驅動

  • 連接數據庫 DriverManager
  • 獲得執行sql的對象 Statement
  • 獲得返回的結果集
  • 釋放連接
  • DriverManager

    // 1. 加載驅動// DriverManager.registerDriver(new com.mysql.jdbc.Driver());Class.forName("com.mysql.jdbc.Driver");

    URL

    String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSl=true";// 協議: //主機地址:端口號/數據庫名?參數1&參數2&參數3

    Statement 執行sql的對象 PrepareStatement執行sql的對象

    statement.executeQuery(); //查詢操作返回ResultSetstatement.execute(); // 執行任何sqlstatement.executeUpdate(); // 更新,插入,刪除

    ResultSet 查詢的結果集:封裝了所有的查詢結果

    獲得指定的數據類型

    resultSet.getObject(); //在不知道列類型的情況下使用// 如果知道列的類型使用指定的類型resultSet.getString();resultSet.getInt();resultSet.getFloat();resultSet.getDate();resultSet.getObject();

    遍歷,指針

    resultSet.beforeFirst(); //移動到最前面resultSet.afterLast(); // 移動到最后面resultSet.next(); // 移動到下一個數據resultSet.previous(); //移動到前一行resultSet.absolute(); //移動到指定行

    釋放資源

    // 釋放資源 resultSet.close(); statement.close(); connection.close();

    10.4 statement對象

    代碼實現

    ? 1.提取工具類

    package h1.p2.utils;import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties;public class JdbcUtils {private static String driver = null;private static String url = null;private static String username = null;private static String password = null;static {try{InputStream in =JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties properties = new Properties();properties.load(in);driver=properties.getProperty("driver");url=properties.getProperty("url");username=properties.getProperty("username");password=properties.getProperty("password");// 1.驅動只用加載一次Class.forName(driver);}catch (Exception e) {e.printStackTrace();}}// 獲取連接public static Connection getClassLoader() throws SQLException {return DriverManager.getConnection(url, username, password);}public static void release(Connection conn,Statement st, ResultSet rs){if (rs!=null){try{rs.close();}catch (SQLException e){e.printStackTrace();}}if (conn!=null){try{conn.close();}catch (SQLException e){e.printStackTrace();}}if (conn!=null){try {conn.close();}catch (SQLException e){e.printStackTrace();}}}}

    ? 2.編寫增刪改的方法,executeUpdate

    package h1.p2; import h1.p2.utils.JdbcUtils;import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class TestInsert {public static void main(String[] args) {Connection conn = null;Statement st= null;ResultSet rs= null;try{conn = JdbcUtils.getConnection();st =conn.createStatement();String sql ="INSERT INTO USER(id,`NAME`,`PASSWORD`,`email`,`birthday`)\n" +"VALUES (4,'zhangssd','124434','12343355@qq.com','2000-01-01')";int i =st.executeUpdate(sql);if (i>0){System.out.println("插入成功");}}catch (SQLException e){e.printStackTrace();}finally {JdbcUtils.release(conn,st,rs);}} }

    SQL注入的問題

    10.5 PreparedStatement對象

    PreparedStatement可以防止sql注入,效率更好!

    package h1.p3;import h1.p2.utils.JdbcUtils;import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.SQLException;public class TestLnsert {public static void main(String[] args) {Connection conn =null;PreparedStatement st =null;try{conn= JdbcUtils.getConnection();String sql ="insert ito users (id,`name`,`password`,`email`,`birthday`) values (?,?,?,?)";st =conn.prepareStatement(sql);// 手動給參數賦值st.setInt(1,4);st.setString(2,"zq");st.setString(3,"1232");st.setString(4,"1121");st.setDate(5,new java.sql.Date(new Date().getTime()));int i =st.executeUpdate();if (i>0){System.out.println("插入成功 ");}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils.release(conn,st,null);}} }

    10.6 使用IDEA連接數據庫

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zgLv35Cc-1649757823745)(C:\Users\27223\AppData\Roaming\Typora\typora-user-images\image-20220410093303541.png)]

    10.7 事務

    要么都成功,要么都失敗

    ACID原則

    原子性:要么全部完成,要么都不完成

    一致性:總數不變

    隔離性:多個進程互不干擾

    持久性:一旦提交不可逆,持久化到數據庫

    隔離性的問題:

    臟讀:一個事務讀取了另一個沒有提交的事務

    不可重復讀:在同一個事務內,重復讀取表中的數據,表數據發生了改變

    虛讀(幻讀):在一個事務內,讀取到了別人插入的數據,導致前后讀出來的結果不一致

    代碼實現

    1.開啟事務 conn.setAutoCommit(false)

    2.一組業務提交完畢,提交事務

    3.可以在catch語句中顯示的定義,回滾語句,但默認失敗就會回滾!

    10.8 數據庫連接池

    數據庫連接---- 執行完畢 —釋放

    連接 — 釋放 十分浪費系統資源

    池化技術:準備一些預先的資源,過來就連接預先準備好的

    編寫連接池,實現一個接口 DataSource

    開源數據實現

    DBCP

    C3P0

    Druid:阿里巴巴

    使用了這些數據庫連接池之后,我們在項目開發中就不需要編寫連接數據庫的代碼了

    DBCP

    main(String[] args) {
    Connection conn =null;
    PreparedStatement st =null;
    try{
    conn= JdbcUtils.getConnection();
    String sql =“insert ito users (id,name,password,email,birthday) values (?,?,?,?)”;
    st =conn.prepareStatement(sql);
    // 手動給參數賦值
    st.setInt(1,4);
    st.setString(2,“zq”);
    st.setString(3,“1232”);
    st.setString(4,“1121”);
    st.setDate(5,new java.sql.Date(new Date().getTime()));

    int i =st.executeUpdate();if (i>0){System.out.println("插入成功 ");}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils.release(conn,st,null);}}

    }

    ## 10.6 使用IDEA連接數據庫[外鏈圖片轉存中...(img-zgLv35Cc-1649757823745)]## 10.7 事務==要么都成功,要么都失敗==> ACID原則原子性:要么全部完成,要么都不完成一致性:總數不變隔離性:多個進程互不干擾持久性:一旦提交不可逆,持久化到數據庫隔離性的問題:臟讀:一個事務讀取了另一個沒有提交的事務不可重復讀:在同一個事務內,重復讀取表中的數據,表數據發生了改變虛讀(幻讀):在一個事務內,讀取到了別人插入的數據,導致前后讀出來的結果不一致> 代碼實現1.開啟事務 conn.setAutoCommit(false)2.一組業務提交完畢,提交事務3.可以在catch語句中顯示的定義,回滾語句,但默認失敗就會回滾!## 10.8 數據庫連接池數據庫連接---- 執行完畢 ---釋放連接 --- 釋放 十分浪費系統資源==池化技術:準備一些預先的資源,過來就連接預先準備好的====編寫連接池,實現一個接口 DataSource==> 開源數據實現DBCPC3P0Druid:阿里巴巴==使用了這些數據庫連接池之后,我們在項目開發中就不需要編寫連接數據庫的代碼了==> DBCP

    總結

    以上是生活随笔為你收集整理的MySQL-JDBC的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。