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 早些年使用的| 事務支持 | 不支持 | 支持 |
| 數據行鎖定 | 不支持 | 支持 |
| 外鍵約束 | 不支持 | 支持 |
| 全文索引 | 支持 | 不支持 |
| 表空間的大小 | 較小 | 較大,約為2倍 |
常規使用操作:
-
MYISAM 節約空間,速度較快
-
INNODB 安全性高 ,事務的處理 , 多表用戶操作
在物理空間存在的位置
所有的數據庫文件都存在data目錄下
本質還是文件的存儲!
mysql引擎在物理文件上的區別
-
innoDB 在數據庫表中只有一個*.frm文件,以及上級目錄下的ibdata1文件
-
MYISAM 文件
- *.frm -表結構的定義文件
- *.MYD 數據文件(data)
- *.MYI 索引文件 (index)
設置數據庫表的字符集編碼
CHARSET=utf8不設置的話,會是mysql默認的字符集編碼~(不支持中文)
mysql的默認編碼是Latin1,不支持中文
在my.ini中配置默認的編碼
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所有的創建和刪除操作盡量加上判斷,以免報錯~
注意點
-
`` 字段名,使用這個包裹!
-
注釋 – /**/
-
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=6 | false |
| <> 或! = | 不等于 | 5<>6 | true |
| > | |||
| < | |||
| <= | |||
| >= | |||
| BETWEEN … and … | 在某個范圍內 | [2,5] | |
| AND | 我和你 | 5.1 and 1>2 | false |
| OR | 我或你|| | 5>1 or 1>2 | true |
注意:
- colnum_name 是數據庫的列,盡量帶上``
- 條件,篩選的條件,如果沒有指定,則會修改所有的列
- value, 是一個具體的值,也可以是一個變量
- 多個設置的屬性之間,使用英文逗號隔開
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 BULL | a is null | 如果操作符為Null,結果為真 |
| IS NOT NULL | a is not null | 如果操作符為Not null ,結果為真 |
| BETWEEN | a between b and c | 若a在b和c之間,則結果為真 |
| Like | a like b | SQL匹配,如果a匹配b,則結果為真 |
| ln | a in (a1,a2,a3 …) | 假設a1,或者a2… 其中的某一個值中,結果為真 |
4.4 聯表查詢
Join 對比
| inner join | 如果表中至少有一個匹配,就返回行 |
| left join | 會從左表中返回所有的值,即使右表沒有匹配 |
| right join | 會從右表中返回所有的值,即使左表中沒有匹配 |
自連接
自己的表和自己的表連接,核心:一張表拆成兩張一樣的表即可
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 平均分>805. 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 () | 最小值 |
?
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
- 快速定位數據
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 zzz8.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
// 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&參數3Statement 執行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()));
}
## 10.6 使用IDEA連接數據庫[外鏈圖片轉存中...(img-zgLv35Cc-1649757823745)]## 10.7 事務==要么都成功,要么都失敗==> ACID原則原子性:要么全部完成,要么都不完成一致性:總數不變隔離性:多個進程互不干擾持久性:一旦提交不可逆,持久化到數據庫隔離性的問題:臟讀:一個事務讀取了另一個沒有提交的事務不可重復讀:在同一個事務內,重復讀取表中的數據,表數據發生了改變虛讀(幻讀):在一個事務內,讀取到了別人插入的數據,導致前后讀出來的結果不一致> 代碼實現1.開啟事務 conn.setAutoCommit(false)2.一組業務提交完畢,提交事務3.可以在catch語句中顯示的定義,回滾語句,但默認失敗就會回滾!## 10.8 數據庫連接池數據庫連接---- 執行完畢 ---釋放連接 --- 釋放 十分浪費系統資源==池化技術:準備一些預先的資源,過來就連接預先準備好的====編寫連接池,實現一個接口 DataSource==> 開源數據實現DBCPC3P0Druid:阿里巴巴==使用了這些數據庫連接池之后,我們在項目開發中就不需要編寫連接數據庫的代碼了==> DBCP總結
以上是生活随笔為你收集整理的MySQL-JDBC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeforces 1045 D. I
- 下一篇: 数据库创建(利用写好的数据库表生成创建表