MySQL-JDBC
1.初識MySQL
JavaEE:企業(yè)級Java開發(fā) Web
前端(頁面,展示,數(shù)據(jù)!)
后臺(連接點:連接數(shù)據(jù)庫JDBC,連接前端(控制,控制視圖跳轉(zhuǎn),和給前端傳遞數(shù)據(jù))
數(shù)據(jù)庫(存數(shù)據(jù),Txt …)
1.1 為什么學(xué)習(xí)數(shù)據(jù)庫
數(shù)據(jù)庫是所有軟件體系中最核心的存在 DBA
1.2什么是數(shù)據(jù)庫
數(shù)據(jù)庫 (DB ,DataBase)
概念:數(shù)據(jù)倉庫,軟件,安裝在操作系統(tǒng)上
作用:存儲數(shù)據(jù),管理數(shù)據(jù)
1.3 數(shù)據(jù)庫分類
? 關(guān)系型數(shù)據(jù)庫
-
Mysql ,Oracle ,Sql Server ,
-
通過表和表之間,行和列之間的關(guān)系進行數(shù)據(jù)的存儲
非關(guān)系型數(shù)據(jù)庫
- Redis ,MongDB
- 非關(guān)系型數(shù)據(jù)庫,對象存儲,通過對象的自身的屬性來決定
DBMC(數(shù)據(jù)庫管理系統(tǒng))
- 數(shù)據(jù)庫的管理軟件,科學(xué)有效的管理我們的數(shù)據(jù),維護和獲取數(shù)據(jù)
- Mysql ,數(shù)據(jù)庫管理系統(tǒng)
1.4連接數(shù)據(jù)庫
命令行連接
show databases; -- 查看所有的數(shù)據(jù)庫 use 數(shù)據(jù)庫名稱 ; --切換數(shù)據(jù)庫 show tables; -- 查看數(shù)據(jù)庫中所有的表 describe student; --查看數(shù)據(jù)庫中所有的表的信息 create database 數(shù)據(jù)庫名稱; --創(chuàng)建一個數(shù)據(jù)庫0 exit; --退出連接 -- 單行注釋 (SQL 的本來的注釋)數(shù)據(jù)庫xxx語言 CRUD增刪改查!
DDL 定義
DML 操作
DQL 查詢
DCL 控制
2.操作數(shù)據(jù)庫
操作數(shù)據(jù)庫 > 操作數(shù)據(jù)庫中的表 > 操作數(shù)據(jù)庫表中的數(shù)據(jù)
2.1操作數(shù)據(jù)庫
1.創(chuàng)建數(shù)據(jù)庫
create database [if not exists] 數(shù)據(jù)庫名稱;2.刪除數(shù)據(jù)庫
drop database [if exists] 數(shù)據(jù)庫名稱;3.使用數(shù)據(jù)庫
如果你的表名或者字段名是一個特殊的字符,就需要帶 `` use `數(shù)據(jù)庫名稱`4.查看數(shù)據(jù)庫
show databases -- 查看所有的數(shù)據(jù)庫2.2數(shù)據(jù)庫的列類型
數(shù)值
- tinyint 十分小的數(shù)據(jù) 1個字節(jié)
- smallint 較小的數(shù)據(jù) 2個字節(jié)
- mediumint 中等大小的數(shù)據(jù) 3個字節(jié)
- int 標(biāo)準(zhǔn)的整數(shù) 4個字節(jié)
- bigint 較大的數(shù)據(jù) 8個字節(jié)
- float 浮點數(shù) 4個字節(jié)
- double 浮點數(shù) 8個字節(jié)
- decimal 字符串形式的浮點數(shù)
字符串
- 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進行運算,結(jié)果為null
2.3 數(shù)據(jù)庫的字段屬性
Unsigned:
-
無符號的整數(shù)
-
聲明了該列不能聲明為負(fù)數(shù)
zerofill:
-
0填充的
-
不足的位數(shù),使用0填充,int(3), 5 —…
子增
- 通常理解為自增,主動在一條記錄的基礎(chǔ)上+1 (默認(rèn))
- 通常用來設(shè)計唯一的主鍵~ index,必須是整數(shù)類型
- 可以自定義設(shè)計主鍵自增的起始值和步長
非空 Null not null
-
假設(shè)設(shè)置為 not null ,如果不給它賦值,就會報錯
-
NUll ,如果不填寫值,默認(rèn)就是nul!
默認(rèn):
- 設(shè)置默認(rèn)的值!
- sex
2.4 創(chuàng)建數(shù)據(jù)庫表
CREATE TABLE IF NOT EXISTS `studen` (`id` INT (4) NOT NULL AUTO_INCREMENT COMMENT '學(xué)號', `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] `表名` ('字段名' 列類型 [屬性] [索引] [注釋],'字段名' 列類型 [屬性] [索引] [注釋],......'字段名' 列類型 [屬性] [索引] [注釋] )[表類型][字符集設(shè)置][注釋]常用命令
SHOW CREATE DATABASE school --查看創(chuàng)建數(shù)據(jù)庫的語句 SHOW CREATE TABLE student --查看student數(shù)據(jù)表的定義語句 DESC student --顯示表的結(jié)構(gòu)2.5 數(shù)據(jù)表的類型
--關(guān)于數(shù)據(jù)庫引擎 innodb 默認(rèn)使用 myisam 早些年使用的| 事務(wù)支持 | 不支持 | 支持 |
| 數(shù)據(jù)行鎖定 | 不支持 | 支持 |
| 外鍵約束 | 不支持 | 支持 |
| 全文索引 | 支持 | 不支持 |
| 表空間的大小 | 較小 | 較大,約為2倍 |
常規(guī)使用操作:
-
MYISAM 節(jié)約空間,速度較快
-
INNODB 安全性高 ,事務(wù)的處理 , 多表用戶操作
在物理空間存在的位置
所有的數(shù)據(jù)庫文件都存在data目錄下
本質(zhì)還是文件的存儲!
mysql引擎在物理文件上的區(qū)別
-
innoDB 在數(shù)據(jù)庫表中只有一個*.frm文件,以及上級目錄下的ibdata1文件
-
MYISAM 文件
- *.frm -表結(jié)構(gòu)的定義文件
- *.MYD 數(shù)據(jù)文件(data)
- *.MYI 索引文件 (index)
設(shè)置數(shù)據(jù)庫表的字符集編碼
CHARSET=utf8不設(shè)置的話,會是mysql默認(rèn)的字符集編碼~(不支持中文)
mysql的默認(rèn)編碼是Latin1,不支持中文
在my.ini中配置默認(rèn)的編碼
character-set-server=utf82.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所有的創(chuàng)建和刪除操作盡量加上判斷,以免報錯~
注意點
-
`` 字段名,使用這個包裹!
-
注釋 – /**/
-
sql關(guān)鍵字大小寫不敏感
-
所有的符號全部英文
3.MYSQL的數(shù)據(jù)管理
3.1 外鍵
方式一,在創(chuàng)建表的時候,增加約束
CREATE TABLE IF NOT EXISTS `student` ( `id`INT(4) NOT NULL AUTO_INCREMENT COMMENT '學(xué)號', `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 '學(xué)生的年級', `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刪除有外鍵關(guān)系的表的時候,必須要先刪除引用別人的表(從表),在刪除被引用的表(主表)。
方式二:創(chuàng)建表成功后,添加外鍵約束
-- 創(chuàng)建表的時候沒有外鍵關(guān)系 alter table 表名 add constraint 約束名 foreign key (作為外鍵的列) references 哪個表(哪個字段)以上操作都是物理外鍵,數(shù)據(jù)庫級別的外鍵,不建議使用
最佳實踐
-
數(shù)據(jù)庫就是單純的表,只用來存數(shù)據(jù),只有行(數(shù)據(jù))和列(字段)
-
我們想使用多張表的數(shù)據(jù),想使用外鍵(程序去實現(xiàn))
3.2 DML語言
數(shù)據(jù)庫意義:數(shù)據(jù)存儲,數(shù)據(jù)管理
DML語言:數(shù)據(jù)操作語言
- insert
- update
- delete
3.3 添加
insert
-- 插入語句(添加) -- insert into 表名([字段名1,字段2,字段3])values ('值1'),('值2'),('值3') insert into `grade`(`gradenaem`) value ('大四')-- 由于主鍵自增我們可省略(如果不寫表的字段,他就會一一匹配) insert into 'grade' value('大三')-- 一般寫插入語句,我們一定要數(shù)據(jù)和字段一一對應(yīng)!語法: insert into 表名([字段名1,字段2 ,字段3])value (‘值1’),(‘值2’), (‘值3’,…)
注意事項:
1.字段和字段之間使用逗號隔開
2.字段是可以省略的,但是后面的值必須要一一對應(yīng) ,不能少
3.可以同時插入多條數(shù)據(jù),VALUES后面的值,需要使用,隔開即可 VALUES (), (), …
3.4 修改
UPDATE 修改誰 (條件) set 原來的值= 新值
-- 語法: -- update 表名 set colnum_name = value , [colnum_name = value,......] where [條件]條件: where 子句 運算符 id等于某個值,大于某個值 ,在某個區(qū)間內(nèi)修改 …
操作符會返回布爾值
| = | 等于 | 5=6 | false |
| <> 或! = | 不等于 | 5<>6 | true |
| > | |||
| < | |||
| <= | |||
| >= | |||
| BETWEEN … and … | 在某個范圍內(nèi) | [2,5] | |
| AND | 我和你 | 5.1 and 1>2 | false |
| OR | 我或你|| | 5>1 or 1>2 | true |
注意:
- colnum_name 是數(shù)據(jù)庫的列,盡量帶上``
- 條件,篩選的條件,如果沒有指定,則會修改所有的列
- value, 是一個具體的值,也可以是一個變量
- 多個設(shè)置的屬性之間,使用英文逗號隔開
3.5 刪除
delete 命令
語法:delete from 表名 [where 條件]
-- 刪除數(shù)據(jù) (避免這樣寫,會全部刪除) delete from `student`-- 刪除指定數(shù)據(jù) delete from `student` where id = 1;TRUNCATE 命令
作用:完全清空一個數(shù)據(jù)庫表,表的結(jié)構(gòu)和索引約束不會變!
-- 清空 student 表 TRUNCATE `student`delete 的 TRUNCATE區(qū)別
- 相同點:都能刪除數(shù)據(jù)庫,都不會刪除表結(jié)構(gòu)
- 不同:
- TRUNCATE 重新設(shè)置 自增列計數(shù)器會歸零
- TRUNCATE 不會影響事務(wù)
DELETE刪除的問題:,重啟數(shù)據(jù)庫,現(xiàn)象
- InnoDB 自增列會從1開始 (存在內(nèi)存當(dāng)中的,斷電即失)
- MyISAM 繼續(xù)從上一個子增量開始
4.DQL 查詢數(shù)據(jù)
4.1 DQL
(Data Query LANGUAGE: 數(shù)據(jù)查詢語言)
-
所有的操作都用它 Select
-
簡單的查詢,復(fù)雜的查詢它都能做
-
數(shù)據(jù)庫最核心的語言,最重要的語句
-
使用頻率最高的語句
select 完整的語法:
select 語法
select [all | distinct][left |right |inner join ][where ...] ---- 指定結(jié)果需要滿足的條件[group by ...] ---- 指定結(jié)果按照哪幾個字段來分組[having ] ---- 過濾分組的記錄必須滿足得到次要條件[order by ] ---- 指定查詢記錄按一個或多個條件排序[limit] ---- 指定查詢的記錄從哪條至哪條4.2 指定查詢字段
-- 查詢?nèi)康膶W(xué)生 select 字段 from 表 select * from student-- 查詢指定字段 select `student`, `Studentname` from student-- 別名 ,給結(jié)果起一個名字 AS 可以給字段起別名,也可以給表起別名 select `student` as 學(xué)號 , `strudentname` as 學(xué)生姓名 from student AS s-- 函數(shù) Concat(a,b)qq select concat ('姓名:' StudentName) AS 新名字 FROM student語法: select 字段, … from 表
有的時候,列名字不是那么的見名知意。我們起別名 AS 字段名 as 別名 表名 as 別名
去重 distinct
作用:去除select查詢出來的結(jié)果中重復(fù)的數(shù)據(jù),重復(fù)的數(shù)據(jù)只顯示一條
-- 查詢一下有哪些同學(xué)參加了考試,成績 select * from result -- 查詢?nèi)康目荚嚦煽?select `studentNo` from result -- 查詢?nèi)康目荚嚦煽?select distinct `studentNo` from result -- 發(fā)現(xiàn)重復(fù)數(shù)據(jù),去重數(shù)據(jù)庫的列(表達式)
select version() --查詢系統(tǒng)版本 select 100*3-1 AS 計算結(jié)果 -- 用來計算(表達式) select @@auto_increment_increment -- 查詢自增的步長 (變量)-- 學(xué)員考試成績 +1 分查看 select `StudentNo` ,`StudentResult` +1 AS '提分后' FROM result數(shù)據(jù)庫中的表達式:文本值,列,Null,函數(shù),計算表達式,系統(tǒng)變量 …
select 表達式 from 表
4.3 where 條件子句
作用: 檢索數(shù)據(jù)中符合條件的值
搜索的條件由一個或者多個表達式組成!
邏輯運算符
| and && | a and b a&&b | 邏輯與,兩個都為真,結(jié)果為真 |
| or || | a or b a||b | 邏輯或,其中一個為真,則結(jié)果為真 |
| Not ! | not a !a | 邏輯非,真為假,假為真 |
模糊查詢:比較運算符
| IS BULL | a is null | 如果操作符為Null,結(jié)果為真 |
| IS NOT NULL | a is not null | 如果操作符為Not null ,結(jié)果為真 |
| BETWEEN | a between b and c | 若a在b和c之間,則結(jié)果為真 |
| Like | a like b | SQL匹配,如果a匹配b,則結(jié)果為真 |
| ln | a in (a1,a2,a3 …) | 假設(shè)a1,或者a2… 其中的某一個值中,結(jié)果為真 |
4.4 聯(lián)表查詢
Join 對比
| inner join | 如果表中至少有一個匹配,就返回行 |
| left join | 會從左表中返回所有的值,即使右表沒有匹配 |
| right join | 會從右表中返回所有的值,即使左表中沒有匹配 |
自連接
自己的表和自己的表連接,核心:一張表拆成兩張一樣的表即可
4.5 分頁和排序
排序
-- 排序: 升序ASC , 降序 DESC -- ORDER BY 通過哪個字段字段排序分頁
-- [pageSize] 頁面大小-- [(n-1)*pageSize] 起始值-- [n: ] 當(dāng)前頁面-- [數(shù)據(jù)總數(shù)/頁面大小=總頁數(shù)]語法:limit(查詢起始下標(biāo),pageSize)
4.6 子查詢
where (這個值是計算出來的)
本質(zhì): 在where語句中嵌套一個子查詢語句
4.7 分組和過濾
-- 查詢不同課程的平均分,最高分,最低分 -- 核心:(根據(jù)不同的課程分組) 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 平均分>805. MYSQL 函數(shù)
5.1 常用函數(shù)
-- 字符串函數(shù) SELECT CHAR_LENGTH('即使再小的帆也能遠航') -- 字符串長度 SELECT CONCAT ('即使','再小','的帆') -- 拼接字符串 SELECT INSERT ('撥開云霧',1,2,'見明日') -- 查詢,從某個位置開始替換 SELECT LOWER ('AAaa') -- 小寫字母 SELECT UPPER ('AAAA') -- 大寫字母 SELECT INSTR ('abcde','a') -- 返回第一次出現(xiàn)的字符串的索引 SELECT REPLACE ('即使再小的帆也能遠航','即使','遠航') -- 替換出現(xiàn)的指定字符串 SELECT SUBSTR ('即使再小的帆也能遠航',4,6) -- 返回指定的字符串 SELECT REVERSE ('即使再小') -- 反轉(zhuǎn) -- 查詢姓 周的同學(xué), 名字 州 SELECT REPLACE (Studentname,'周','州') FROM student WHERE studentname LIKE '周%'-- 時間和日期函數(shù) SELECT CURRENT_DATE() -- 獲取當(dāng)前日期 SELECT CURDATE() -- 獲取當(dāng)前日期 SELECT NOW() -- 獲取當(dāng)前的時間 SELECT LOCALTIME () -- 本地時間 SELECT SYSDATE() -- 系統(tǒng)時間SELECT YEAR(NOW()) -- 年 SELECT MONTH(NOW()) -- 月 SELECT DAY(NOW()) -- 日 SELECT HOUR(NOW()) -- 時 SELECT MINUTE(NOW()) -- 分 SELECT SECOND(NOW()) -- 秒-- 系統(tǒng) SELECT SYSTEM_USER() SELECT USER() SELECT VERSION()5.2 聚合函數(shù)(常用)
| COUNT ( ) | 計數(shù) |
| SUM () | 求和 |
| AVG () | 平均值 |
| MAX () | 最大值 |
| MIN () | 最小值 |
?
5.3 數(shù)據(jù)庫級別的MD5加密
什么是MD5
主要增強算法的復(fù)雜度和不可逆性
MD5不可逆,具體的值的MD5是一樣的
MD5破解網(wǎng)站的原理,背后有一個字典,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.事務(wù)
6.1 什么是事務(wù)
要么都成功,要么都失敗
事務(wù)原則:ACID原則 原子性 ,一致性 , 隔離性 , 持久性 (臟讀,幻讀…)
原子性(Atomicity)
要么都成功,要么都失敗
一致性(Consistency)
事務(wù)前后的數(shù)據(jù)完整性要保持一致
持久性(Durability)–事務(wù)提交
事務(wù)一旦提交則不可逆,被持久化到數(shù)據(jù)庫中!
隔離性(Isolation)
事物的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,事物之間要相互隔離
隔離所導(dǎo)致的一些問題
臟讀:
指一個事務(wù)讀取了另外一個事務(wù)未提交的數(shù)據(jù)。
不可重復(fù)讀:
在一個事務(wù)內(nèi)讀取表中的某一行數(shù)據(jù),多次讀取結(jié)果不同。(這個不一定是錯誤的,只是某些場合不對)
虛讀(幻讀):
是指在一個事務(wù)內(nèi)讀取到了別人的事務(wù)插入的數(shù)據(jù),導(dǎo)致前后讀取不一致
-- 事務(wù) -- mysql是默認(rèn)開啟事務(wù)自動提交的 SET autocommit = 0 /*關(guān)閉*/ SET autocommit = 1 /* 開啟(默認(rèn)的)*/-- 手動處理事務(wù)-- 事務(wù)開啟 START TRANSACTION -- 標(biāo)記一個事務(wù)的開始,從這個之后的sql都在同一個事務(wù)內(nèi)INSERT xx INSERT xx-- 提交:持久化(成功!) COMMIT -- 回滾: 回到原來的樣子 (失敗!) ROLLBACK -- 事務(wù)結(jié)束 SET autocommit = 1 -- 開啟自動提交-- 了解 SAVEPOINT 保存點名 -- 設(shè)置一個事務(wù)的保存點 ROLLBACK TO SAVEPOINT 保存點名 -- 回滾到保存點 RELEASE SAVEPOINT 保存點名 -- 撤銷保存點模擬場景
-- 轉(zhuǎn)賬 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)-- 模擬轉(zhuǎn)賬:事務(wù) SET autocommit = 0; -- 關(guān)閉自動提交 START TRANSACTION -- 開啟一個事務(wù) (一組事務(wù))UPDATE ACCOUNT SET money=money-500 WHERE `name` = 'A' -- A減500 UPDATE ACCOUNT SET money=money+500 WHERE `name` = 'B' -- A加500COMMIT; -- 提交事務(wù),就被持久化了 ROLLBACK; -- 回滾SET autocommit = 1; -- 恢復(fù)默認(rèn)值7. 索引
mysql 官方對索引的定義為:索引(Index)是幫助mysql高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
提取句子主干,就可以得到索引的本質(zhì):索引是數(shù)據(jù)結(jié)構(gòu)
7.1 索引的分類
- 主鍵索引 (PRIMARY KEY)
- 唯一的標(biāo)識,主鍵不可重復(fù),只能有一個列作為主鍵
- 唯一索引 (UNIQUE KEY)
- 避免重復(fù)的列出現(xiàn),唯一的索引可以重復(fù),多個列都可以標(biāo)識為唯一索引
- 常規(guī)索引 (KEY/Index)
- 默認(rèn)的,index 。key關(guān)鍵字來設(shè)置
- 全文索引 (FullText)
- 在特定的數(shù)據(jù)庫引擎下才有,MylSAM
- 快速定位數(shù)據(jù)
7.2 測試索引
索引在小數(shù)據(jù)量的時候,用戶不大,但是在大數(shù)據(jù)的時候,區(qū)別十分明顯
7.3 索引原則
-
索引不是越多越好
-
不要對進程變動數(shù)據(jù)加索引
-
小數(shù)據(jù)量的表不需要加索引
-
索引一般加在常用來查詢的字段上!
索引的數(shù)據(jù)結(jié)構(gòu)
Hash類型的索引
Btree:InnoDB的默認(rèn)數(shù)據(jù)結(jié)構(gòu)
8. 權(quán)限管理和備份
8.1 用戶管理
-- 創(chuàng)建用戶 create user 用戶名 identified by '密碼' CREATE USER zzz IDENTIFIED BY '123456'-- 修改密碼(修改當(dāng)前用戶密碼) SET PASSWORD = PASSWORD('123456')-- 修改密碼 (修改指定用戶密碼) SET PASSWORD FOR zzz =PASSWORD('123456')-- 重命名 rename user 原來名字 to 新的名字 RENAME USER zzz TO zaa-- 用戶授權(quán) all privileges 全部權(quán)限 ,庫,表 -- all privileges 除了給別人授權(quán),其他都能干 GRANT ALL PRIVILEGES ON *.* TO zzz-- 查詢權(quán)限 SHOW GRANTS FOR zzz -- 查看指定用戶的權(quán)限 SHOW greate FOR root@localhost-- root 用戶權(quán)限 :grant all privileges on *.* to 'root'@'localhost' with grant option-- 撤銷權(quán)限 revoke 哪些權(quán)限 ,在哪個庫撤銷,給誰撤銷 REVOKE ALL PRIVILEGES ON *.* FROM zzz -- 刪除用戶 DROP USER zzz8.2 MYSQL備份
為什么要備份:
- 保證重要的數(shù)據(jù)不丟失
- 數(shù)據(jù)轉(zhuǎn)移
mysql數(shù)據(jù)庫備份的方式
-
直接拷貝物理文件
-
在Sqlyog這種可視化工具手動導(dǎo)出
-
使用命令行導(dǎo)出 Mysqldump 命令行使用
mysqldump -h主機 -u用戶名 -p密碼 數(shù)據(jù)庫 表名 >物理磁盤的位置/文件名導(dǎo)入 source 備份文件
9 . 規(guī)范數(shù)據(jù)庫設(shè)計
9.1 為什么需要設(shè)計
當(dāng)數(shù)據(jù)庫比較復(fù)雜的時候,我們就需要設(shè)計了
糟糕的數(shù)據(jù)庫設(shè)計:
- 數(shù)據(jù)冗余,浪費空間
- 數(shù)據(jù)庫插入和刪除都會麻煩,異常【屏蔽使用物理外鍵】
- 程序的性能差
良好的數(shù)據(jù)庫設(shè)計:
- 節(jié)省內(nèi)存空間
- 保證數(shù)據(jù)庫的完整性
- 方便我們開發(fā)系統(tǒng)
軟件開發(fā)中,關(guān)于數(shù)據(jù)庫的設(shè)計
- 分析需求:分析業(yè)務(wù)和需要處理的數(shù)據(jù)庫的需求
- 概要設(shè)計:設(shè)計關(guān)系圖E-R圖
設(shè)計數(shù)據(jù)庫的步驟:(個人博客)
- 收集信息,分析需求
- 用戶表(用戶登錄注銷)
- 分類表
- 文章表
- 友鏈表
- 自定義表
-
標(biāo)識實體
-
標(biāo)識實體之間的關(guān)系
9.2 三大范式
為什么需要數(shù)據(jù)規(guī)范化?
-
信息重復(fù)
-
更新異常
-
插入異常
- 無法正常顯示信息
-
刪除異常
- 丟失有效的信息
三大范式
第一范式(1NF)
原子性:保證每一列不可再分
第二范式(2NF)
前提:滿足第一范式
每張表只描述一件事情
第三范式(3NF)
前提:滿足第一范式和第二范式
第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)
(規(guī)范數(shù)據(jù)庫的設(shè)計)
規(guī)范性和性能的問題
關(guān)聯(lián)查詢的表不得超過三張表
- 考慮商業(yè)化的需求和目標(biāo),(成本,用戶體驗)數(shù)據(jù)庫的性能更加重要
- 在規(guī)范性能的問題的時候,需要適當(dāng)?shù)目紤]一下規(guī)范性!
- 故意給某些表增加一些冗余的字段(從多表查詢變?yōu)閱伪聿樵?#xff09;
10.JDBC(重點)
10.1 數(shù)據(jù)庫驅(qū)動
驅(qū)動:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QjMCMgyg-1649757823743)(C:\Users\27223\AppData\Roaming\Typora\typora-user-images\image-20220409084111503.png)]
我們的程序會通過數(shù)據(jù)庫驅(qū)動和數(shù)據(jù)庫打交道!
10.2 JDBC
SUN公司為了簡化開發(fā)人員的操作,提供了一個(java操作數(shù)據(jù)庫的)規(guī)范,俗稱JDBC
這些規(guī)范的實現(xiàn)由具體的廠商去做
對于開發(fā)人員來說,我們只需要掌握J(rèn)DBC接口的操作即可!
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QPH8IvtH-1649757823744)(C:\Users\27223\AppData\Roaming\Typora\typora-user-images\image-20220409084541574.png)]
java.sql
javax.sql
還需要導(dǎo)入一個數(shù)據(jù)庫驅(qū)動包 mysql-connector-java-5.1.47.jar
10.3 第一個JDBC程序
導(dǎo)入測試數(shù)據(jù)庫
package h1.p1;import java.sql.*;public class JdbcFirstDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1. 加載驅(qū)動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. 連接成功,數(shù)據(jù)庫對象 Connection 代表數(shù)據(jù)庫Connection connection = DriverManager.getConnection(url,username,password);// 4.執(zhí)行sql的對象去執(zhí)行sql 可能存在結(jié)果,查看返回結(jié)果Statement statement = connection.createStatement();// 5. 執(zhí)行sql的對象去執(zhí)行sql,可能存在結(jié)果,查看返回結(jié)果String sql ="select * from users";ResultSet resultSet= statement.executeQuery(sql); //返回的結(jié)果集while(resultSet.next()){System.out.println("id"+resultSet.getObject("id"));}resultSet.close();} }步驟總環(huán):
? 1.加載驅(qū)動
DriverManager
// 1. 加載驅(qū)動// 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";// 協(xié)議: //主機地址:端口號/數(shù)據(jù)庫名?參數(shù)1&參數(shù)2&參數(shù)3Statement 執(zhí)行sql的對象 PrepareStatement執(zhí)行sql的對象
statement.executeQuery(); //查詢操作返回ResultSetstatement.execute(); // 執(zhí)行任何sqlstatement.executeUpdate(); // 更新,插入,刪除ResultSet 查詢的結(jié)果集:封裝了所有的查詢結(jié)果
獲得指定的數(shù)據(jù)類型
resultSet.getObject(); //在不知道列類型的情況下使用// 如果知道列的類型使用指定的類型resultSet.getString();resultSet.getInt();resultSet.getFloat();resultSet.getDate();resultSet.getObject();遍歷,指針
resultSet.beforeFirst(); //移動到最前面resultSet.afterLast(); // 移動到最后面resultSet.next(); // 移動到下一個數(shù)據(jù)resultSet.previous(); //移動到前一行resultSet.absolute(); //移動到指定行釋放資源
// 釋放資源 resultSet.close(); statement.close(); connection.close();10.4 statement對象
代碼實現(xiàn)
? 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.驅(qū)動只用加載一次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);// 手動給參數(shù)賦值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連接數(shù)據(jù)庫
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zgLv35Cc-1649757823745)(C:\Users\27223\AppData\Roaming\Typora\typora-user-images\image-20220410093303541.png)]
10.7 事務(wù)
要么都成功,要么都失敗
ACID原則
原子性:要么全部完成,要么都不完成
一致性:總數(shù)不變
隔離性:多個進程互不干擾
持久性:一旦提交不可逆,持久化到數(shù)據(jù)庫
隔離性的問題:
臟讀:一個事務(wù)讀取了另一個沒有提交的事務(wù)
不可重復(fù)讀:在同一個事務(wù)內(nèi),重復(fù)讀取表中的數(shù)據(jù),表數(shù)據(jù)發(fā)生了改變
虛讀(幻讀):在一個事務(wù)內(nèi),讀取到了別人插入的數(shù)據(jù),導(dǎo)致前后讀出來的結(jié)果不一致
代碼實現(xiàn)
1.開啟事務(wù) conn.setAutoCommit(false)
2.一組業(yè)務(wù)提交完畢,提交事務(wù)
3.可以在catch語句中顯示的定義,回滾語句,但默認(rèn)失敗就會回滾!
10.8 數(shù)據(jù)庫連接池
數(shù)據(jù)庫連接---- 執(zhí)行完畢 —釋放
連接 — 釋放 十分浪費系統(tǒng)資源
池化技術(shù):準(zhǔn)備一些預(yù)先的資源,過來就連接預(yù)先準(zhǔn)備好的
編寫連接池,實現(xiàn)一個接口 DataSource
開源數(shù)據(jù)實現(xiàn)
DBCP
C3P0
Druid:阿里巴巴
使用了這些數(shù)據(jù)庫連接池之后,我們在項目開發(fā)中就不需要編寫連接數(shù)據(jù)庫的代碼了
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);
// 手動給參數(shù)賦值
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()));
}
## 10.6 使用IDEA連接數(shù)據(jù)庫[外鏈圖片轉(zhuǎn)存中...(img-zgLv35Cc-1649757823745)]## 10.7 事務(wù)==要么都成功,要么都失敗==> ACID原則原子性:要么全部完成,要么都不完成一致性:總數(shù)不變隔離性:多個進程互不干擾持久性:一旦提交不可逆,持久化到數(shù)據(jù)庫隔離性的問題:臟讀:一個事務(wù)讀取了另一個沒有提交的事務(wù)不可重復(fù)讀:在同一個事務(wù)內(nèi),重復(fù)讀取表中的數(shù)據(jù),表數(shù)據(jù)發(fā)生了改變虛讀(幻讀):在一個事務(wù)內(nèi),讀取到了別人插入的數(shù)據(jù),導(dǎo)致前后讀出來的結(jié)果不一致> 代碼實現(xiàn)1.開啟事務(wù) conn.setAutoCommit(false)2.一組業(yè)務(wù)提交完畢,提交事務(wù)3.可以在catch語句中顯示的定義,回滾語句,但默認(rèn)失敗就會回滾!## 10.8 數(shù)據(jù)庫連接池數(shù)據(jù)庫連接---- 執(zhí)行完畢 ---釋放連接 --- 釋放 十分浪費系統(tǒng)資源==池化技術(shù):準(zhǔn)備一些預(yù)先的資源,過來就連接預(yù)先準(zhǔn)備好的====編寫連接池,實現(xiàn)一個接口 DataSource==> 開源數(shù)據(jù)實現(xiàn)DBCPC3P0Druid:阿里巴巴==使用了這些數(shù)據(jù)庫連接池之后,我們在項目開發(fā)中就不需要編寫連接數(shù)據(jù)庫的代碼了==> DBCP總結(jié)
以上是生活随笔為你收集整理的MySQL-JDBC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeforces 1045 D. I
- 下一篇: 数据库创建(利用写好的数据库表生成创建表