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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL-JDBC

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

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 早些年使用的 MYSIAMINNODB
事務(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=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

所有的創(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)修改 …

操作符會返回布爾值

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

注意:

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

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 BULLa is null如果操作符為Null,結(jié)果為真
IS NOT NULLa is not null如果操作符為Not null ,結(jié)果為真
BETWEENa between b and c若a在b和c之間,則結(jié)果為真
Likea like bSQL匹配,如果a匹配b,則結(jié)果為真
lna in (a1,a2,a3 …)假設(shè)a1,或者a2… 其中的某一個值中,結(jié)果為真

4.4 聯(lián)表查詢

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: ] 當(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 平均分>80

5. 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ù)(常用)

函數(shù)名稱描述
COUNT ( )計數(shù)
SUM ()求和
AVG ()平均值
MAX ()最大值
MIN ()最小值
-- 聚合函數(shù) -- 都能夠統(tǒng)計 表中的數(shù)據(jù) (想查詢一個表中有多少個記錄,就使用這個count()) SELECT COUNT(`BornDate`) FROM student; -- Count(字段),會忽略所有的null值 SELECT COUNT(*) FROM student; -- Count(*),不會忽略null值,本質(zhì) 計算行數(shù) SELECT COUNT(1) FROM result; -- Count(1),不會忽略所有的null值 本質(zhì) 計算行數(shù)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 數(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ù)
-- 索引的使用 -- 1.在創(chuàng)建表的時候給字段添加索引 -- 2.在創(chuàng)建完畢后,增加索引-- 顯示所有的索引信息 SHOW INDEX FROM student-- 增加一個全文索引(索引名) 列名 ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`studentName`)-- EXPLAIN 分析sql執(zhí)行的狀況 EXPLAIN SELECT * FROM student; -- 非全文索引EXPLAIN SELECT * FROM student WHERE MATCH(studentName)AGAINST('劉');

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 zzz

8.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ū)動

  • 連接數(shù)據(jù)庫 DriverManager
  • 獲得執(zhí)行sql的對象 Statement
  • 獲得返回的結(jié)果集
  • 釋放連接
  • 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ù)3

    Statement 執(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()));

    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)]## 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。