java篇-数据库MySQL
數據庫基礎
-
數據庫作用
減少內存(掉電就丟失),存儲數據,管理數據,增刪改查,保存數據的容器 -
DB:數據庫
有組織的數據 -
DBMS:數據庫管理系統
數據庫是通過DBMS創建和操作容器 -
SQL:structured query language 結構化查詢語言,定義了操作所有關系數據庫得規則
與數據庫通信的語言,幾乎所有的DBMS都支持SQL -
數據庫的特點:
數據->表->庫
一個數據庫可以有多個表,表名唯一
表具有特性,存儲
表由列組成,也可以稱為字段,所有的表由一個或多個列組成,每一列類似Java中的屬性
行組成 -
產品特點
成本低,開源代碼,免費
性能高
簡單 -
DBMS分兩類
基于文件共享的
基于客戶機-服務器的DBMS -
啟動和停止mysql
使用cmd(管理員),net stop/start mysql
mysql自帶的客戶端:不方便
windows客戶端**P:端口號
h:主機
p:密碼
mysql -h localhost -P 3306 -u root -p
mysql -h localhost -P 3306 -u root -p1234
**
退出:exit/ctrl+c
常見命令
show databases; 展示數據庫
只有test庫可以動
打開庫:use +庫名稱;
查看在哪個庫,select database();
創建表:mysql> create table biaoming(
-> id int,
-> name varchar(20));
查看表的結構:desc biaoming;
查看服務器版本:登錄mysql服務端 select version()
沒有登錄:mysql --version
- mysql的語法規范:
1 不區分大小寫,但建議關鍵字大寫,表名列名小寫
2 每條命令最好用分號結尾
3 每條命令根據需要,可以進行縮進或者換行
4 注釋
單行:#注釋文字
單行:-- 注釋文字,注意兩個-后面有空格空格
多行:/注釋/
- SQL分類:
DDL:操作數據庫、表,關鍵字:create,drop,alter等
DQL:查尋表中得數據, 關鍵字:select,where
DML:增刪改表中得數據,關鍵字:insert, delete, updata
DCL:授權,關鍵字:grant,revoke
- DDL:操作數據庫、表
1、操作數據庫 CRUD
**C: create創建**· 創建數據庫:create database 數據庫名稱;· 創建數據庫判斷是否存在:create database if not exists 數據庫名稱· 創建數據庫并指定字符集名稱:create database 數據庫名稱 character set 字符集名稱;·創建一個數據庫并判斷是否存在,并制定字符集dbg;create database if not exists db4 character set gbk;**R:retrieve:查詢**· 查詢所有數據庫得名稱:show databases;· 查看某個數據庫得字符集:查詢莫格數據庫得創建語句:show create database mysql;**U:update:修改**· 修改數據庫得字符集 alter database 數據庫名稱 character set 字符集名稱**D: delete 刪除**· 刪除數據庫: drop database 數據庫名稱;· 判斷數據庫存在,存在刪除: drop database if exists 數據庫名稱;**使用數據庫**· 查詢當前正在使用得數據庫名稱: select database();· 使用數據庫: use 數據庫名稱;**2、操作表 CRUD** **C: create創建** ·創建:create table 表名(列名1 數據類型1,列名2 數據類型2,...列名n 數據類型n ); 數據庫類型:int :整數,double:小數類型(scroe double(5,2)),date:日期,只包含年月日(yyyy-MM-dd),datetime:日期,包含時分秒,timestamp:時間錯類型:包含時分秒,如果將來不給這個字段賦值,或者為Null,則自動賦值,varchar:字符串類型,如name varchar(20),此處得20表述姓名最大20字符。create table student(id int,name varchar(32),age int,score double(4,1),birthday date,inserttime timestamp); 復制表creat table 新建得表名 like 需要復制表得表名**R:retrieve:查詢**· 查詢某個數據庫中所有得表名稱 show tables;· 查詢表結構: desc 表名;**U:update:修改** ·修改表名稱: alter table 表名 rename to 新得表名 ·修改表得字符集 :alter table 表名稱 character set 字符集名稱; ·添加列:alter table 表名 add 列名 數據類型; ·修改列類型,名稱:alter table 表名 change gender 列名 新列名 新數據類型;或者alter table 表名 modify 列名 新數據類型;; ·刪除列: alter 表名 stu drop 列名; **D: delete 刪除** ·drop table 表名; ·drop table if exists 表名;客戶端圖形化工具:SQLYOG
DML:增刪改表中得數據
1 添加數據
語法:insert into 表名(列名1,列名2,。。。列名n) values(值1,值2,。。值n);
**注意事項:**列名和值要一一對應
如果表名后不定義列名,則給所有列添加值
除了數字類型,其他類型需要使用引號引起來,單雙都可以
2 刪除數據
語法:delete from 表名 where 條件
注意:
如果不加條件,則刪除所有的記錄,一般都屬不建議使用這個
如果要刪除所有的記錄: TRUNCATE TABLE 表名;-- 刪除表,然后建立一個一摸一樣的空表
3 修改數據
語法: update 表名 set 列名1 = 值1,列名 = 值2,。。。 where 條件
注意:
如果不加任何條件,就會修改所有的條件
DQL:查詢表中的記錄
select * from 表名
DQL:查尋表中得數據
- 查詢語句
select * from 表名
語法:
基礎的查詢
多個字段的查詢:select 字段名1,字段名2 from 表名
如果查詢所有字段:可以使用*替代這個列表。
去除 重復的結果:delect distinct 列名 from 表名;
計算列:可以使用四則表達式計算一些列的表達式
條件查詢
where子句后跟條件
運算符
like:
1 排序查詢
語法:
注意:當有多個排序條件,只有當前面的值相等時,才會判斷當前的排序語句
2 聚合函數:將一列數據作為整體,進行縱向計算
count:計算個數
一般選擇非空的列:主鍵
count(*)
max:計算最大值
min:計算最小值
sum:求和
avg:平均值
注意:聚合函數的計算,會排除空的值
解決方案:選擇不包含非空的列:主鍵
IFNULL函數
3 分組查詢
語法:group by
注意:
分組之后查詢的字段:分組字段和聚合函數
where和having的區別:where在分組之前就進行限定,不滿足則不進行分組。having是在分組之后限定,如果不滿足條件,不會顯示出來
where 后不可以跟聚合函數,having可以跟
4 分頁查詢
語法: limit 開始的索引,每頁查詢的條數;
分頁操作是 一個“方言”limit只能在mysql中使用
- 約束:對表中的數據限定,保證數據的正確性,有效性和完整性
分類:
1 主鍵約束:primary key
、注意:含義:非空且唯一
一張表只能有一個字段為主鍵
主鍵就是表中記錄的唯一標識
、在創建表時,添加主鍵約束
、刪除主鍵
ALTER TABLE student DROP PRIMARY KEY;、創建完表后,添加主鍵
ALTER TABLE student MODIFY id INT PRIMARY KEY;、自動增長:
- 如果一列數值類型,使用auto_increment可以完成值的自動增長
- 再創建表時,添加主鍵約束,并且完成自鍵自增長
- 刪除自動增長
- 添加自動增長
2 非空約束:not null
、在創建表時創建約束
、創建表后添加非空約束
ALTER TABLE student MODIFY NAME VARCHAR(20) NOT NULL;、刪除非空約束
-- 刪除name的非空約束 ALTER TABLE student MODIFY NAME VARCHAR(20);3 唯一約束:unique,值不能重復
-- 創建表時添加唯一約束 CREATE TABLE student(id INT,phone_number VARCHAR(20) UNIQUE -- 添加唯一約束 );-- 刪除唯一約束 -- alter table student modify phone_number varchar(20);-- 刪除不了,這是錯誤的 ALTER TABLE student DROP INDEX phone_number;-- 創建表之后添加唯一約束 ALTER TABLE student MODIFY phone_number VARCHAR(20) UNIQUE;注意唯一限定可以有多個null值
4 外鍵約束:foregin key
、在創建表時,可以添加外鍵
* 語法:
、刪除外鍵:
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;、創建表后添加外鍵
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id);、級聯操作:在修改和刪除主表的主鍵時,同時更新或刪除副表的外鍵值,稱為級聯操作
- 添加刪除級聯操作
- 分類
級聯更新 ON UPDATE CASCADE
級聯刪除 ON DELETE CASCADE;
在實際的操作中,會非常謹慎使用
數據庫的設計
- 多表之間的關系
、分類
1 一對一:如人和身份證
分析一個人只有一個身份證,一個身份證只能對應一個人
2一對多,多對一:
如部門和員工
3 多對多
如學生和課程
、實現關系
1一對多,多對一:
在 多的一方建立外鍵,指向一的一方的主鍵
2 多對多:
要借助中間表(在后面介紹)中間表至少包含兩個字符,這兩個字符作為第三張表的外鍵,分別指向兩張表的主鍵
聯合主鍵
- 范式:設計數據庫時,所需要遵循的關系
分類:
- 1 第一范式(1NF):每一列都是不可分割的原子數據項
- 2 第二范式(2NF): 在1NF的基礎上,非碼屬性必須依賴于候選碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)
幾個概念
函數依賴:A->B,如果可以通過A的值能夠確定B的值,那可以說B依賴于A
完全函數依賴:A->B,如果A是一個屬性組,則B的值是由A屬性組所有的屬性值所確定
部分函數依賴:A-》B,如果A是一個屬性組則B的屬性值的確認只需要A屬性組的值
傳遞函數依賴A->B,B->C,則稱C傳遞函數依賴于C
碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性值)為該表的碼
主屬性:碼所有的屬性
非主屬性:除對碼屬性組的屬性 - 3 第三范式(3NF):在2NF的基礎上,任何非主屬性不依賴于其他非主屬性(在2NF基礎上消除傳遞依賴)
數據庫的備份和還原:
1 命令行
備份
mysqldump -u用戶名 -p密碼 >保存的路徑
還原
登錄數據庫,創建數據庫,使用數據庫,執行文件,source
2 圖形化工具
多表查詢:
笛卡爾積:有兩個集合A和B取這兩個集合的組合情況
要完成多表查詢,需要消除無用的數據
分類:
1 內連接查詢:
- 隱式內鏈接:使用where條件消除無用得
- 顯示內連接:
注意事項:
從那些表中查詢數據
查詢條件是什么
查詢哪些字段
2 外連接查詢
- 左外鏈接
查詢的是左表所有數據以及其交集部分
- 右外鏈接
查詢的是右表所有數據以及其交集部分
3 子查詢
概念:查詢中嵌套子查詢,稱嵌套的查詢為子查詢
例如
子查詢不同情況:
1單行單列:
子查詢可以作為條件,使用運算符操作 > >= < <= =
2多行單列
子查詢可以作為條件,查詢的結果多行單列,使用in
3多行多列
子查詢可以作為一張虛擬表
事務
1. 基本介紹:
- 基本概念: 如果一個包含多個步驟的業務操作被事務管理,那么這些操作同時成功,要么同時失敗
- 操作:
開啟事務 start transaction
回滾 rollback
提交 commit
MySQL中事務默認自動提交:事務提交的兩種方式:自動提交,MySQL是自動提交的,一條DML(真刪改)語句會自動提交一次事務
手動提交:需要先開啟事務,在提交
修改事務的默認提交方式:
SELECT @@autocommit;-- 1 自動提交,0手動提交
SET @@autocommit=0;-- 修改
Oracle數據庫是手動提交的,所以要神效要用commit語句
2. 事務四大特征(面試)
3. 事務的隔離級別
多個事務之間相互獨立,如果多個事務操作同一批數據會出現一些問題,設置不同的隔離級別就可以解決這些問題
- 臟讀:一個事務讀取到另一個事務中沒有提交的數據
- 不可重復讀:在同一個事務中,兩次讀取的數據不一樣
- 幻讀:一個事務(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改
- read uncommitted: 讀未提交
產生的問題:臟讀、不可重讀、幻讀 - read committed:讀以提交
產生的問題:不可重讀、幻讀 - repeatable read:可重復度
產生的問題:幻讀 - serializable:串行化
可以解決所有的問題
注意隔離級別從小到大安全性越高,但是效率越低 - 數據庫設置隔離級別
set global transaction isolation level 級別字符串; - 讀取數據庫隔離級別
select @@tx_isolation;
DCL:
DDL:操作數據庫和表
DML:增刪改表中的數據
DQL:查詢表中數據
DCL:管理用戶和授權
DBA:數據庫管理員
- 查詢權限-- 查詢權限 SHOW GRANTS FOR '用戶名'@'主機名';
- 授予權限-- 授予權限 grant 權限列表 on 數據庫名.表名 to '用戶名'@ '表名'
- 撤銷權限
JDBC
概念:Java database connectivity Java ,Java數據庫連接
定義了一套操作所有關系型數據庫的規則(接口)
JDBC本質:其實是官方公司定義的一套操作所有關系型數據庫的規則,即接口。各個數據庫廠商去實現這套接口,提供數據庫驅動JAR包,我們可以使這套接口(JDBC)編程,真正執行的代碼是驅動jar包中的實現類
快速入門:
步驟:導入驅動jar包: mysql-connector-java-5.1.37-bin.jar,復制這個包到項目某個目錄下,右鍵–build path add jdbc
注冊驅動:
獲取數據庫的連接對象 connection
定義sql 語句
獲取執行sql 語句的對象 statement
執行sql,接收返回的結果
處理結果
釋放資源
各個對象
-
DriverManager:驅動管理對象
功能: - 注冊驅動 :告訴程序使用哪個類驅動。通過查看源碼發現在com.mysql.cj.jdbc.Driver類中存在靜態代碼塊
- 獲取數據庫連接:
Connection getConnection (String url, String user, String password) 通過連接字符串,用戶名,密碼來得到數據庫的連接對象
Connection :數據庫連接對象
Statement :執行sql語句
ResultSet:結果集對象
如:getInt(參數);
參數:- int代表列的參數,從1開始 -string 代表列的名稱
注意:
使用步驟
游標向下移動一行,判斷是否有數據,再獲取數據
抽取JDBC工具類
目的:簡化
分析
注冊驅動
抽取一個方法獲取連接對接
不想傳遞參數,還得保證工具類的通用性
解決方案:配置文件
jdbc.properties
url=
釋放資源
PreparedStatement:執行sql對象,后期都會用這個完成增刪改查的所有操作,可以防止sql注入,效率更高
- sql注入問題:在拼接sql時,有一些特殊關鍵字參與拼接,會造成安全性問題
- 解決sql注入問題:使用PreparedStatement(STATEMENT的子接口)
- 預編譯:
- 步驟:導入驅動jar包: mysql-connector-java-5.1.37-bin.jar,復制這個包到項目某個目錄下,右鍵–build path add jdbc
注冊驅動
獲取數據庫的連接對象 connection
定義sql 語句
- 注意: sql的參數使用?作為占位符
獲取執行sql 語句的對象 PreparedStatement,需要傳遞進去Connection。prepareStatement(String sql);
給?賦值:
- 方法 setXxx(參數1 ,參數2);
參數1
參數2:?的值
執行sql,接收返回的結果
處理結果
釋放資源
JDBC控制事務
- 事務:
- 操作
- 使用connection 對象管理事務
數據庫連接池
數據庫連接池
- 概念:其實就是一個容器,存放數據庫連接的容器。當系統初始化好后,會在容器中申請一些連接對象,當用戶來訪問數據庫時,從容器里獲取連接對象,用戶訪問完后,會將連接歸還給容器
- 優點:訪問高效,節約資源
- 實現
- 標準接口:DataSource Java.sql包下
- 方法:getConnection(),如果連接對象Connection是從連接池中獲取的,那么調用Connection.close()方法,則不會再關閉連接了。而是歸還連接
- 一般我們不去實現它,由數據庫廠商去實現
- C3P0:數據庫連接池技術
- Druid:數據庫連接池實現技術,由阿里巴巴提供的
- 標準接口:DataSource Java.sql包下
導入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
- 不要忘記導入數據庫驅動jar包
定義配置文件:
- 名稱: c3p0.properties 或者 c3p0-config.xml
- 路徑:直接將文件放在src目錄下即可。
創建核心對象 數據庫連接池對象 ComboPooledDataSource
獲取連接: getConnection
spring JDBC
* Spring框架對JDBC的簡單封裝。提供了一個JDBCTemplate對象簡化JDBC的開發
- 步驟:
-
導入jar包
-
創建JdbcTemplate對象。依賴于數據源DataSource
- JdbcTemplate template = new JdbcTemplate(ds);
-
調用JdbcTemplate的方法來完成CRUD的操作
- update():執行DML語句。增、刪、改語句
- queryForMap():查詢結果將結果集封裝為map集合,將列名作為key,將值作為value 將這條記錄封裝為一個map集合
- 注意:這個方法查詢的結果集長度只能是1
- queryForList():查詢結果將結果集封裝為list集合
- 注意:將每一條記錄封裝為一個Map集合,再將Map集合裝載到List集合中
- query():查詢結果,將結果封裝為JavaBean對象
- query的參數:RowMapper
- 一般我們使用BeanPropertyRowMapper實現類。可以完成數據到JavaBean的自動封裝
- new BeanPropertyRowMapper<類型>(類型.class)
- query的參數:RowMapper
- queryForObject:查詢結果,將結果封裝為對象
- 一般用于聚合函數的查詢
總結
以上是生活随笔為你收集整理的java篇-数据库MySQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql select 子查询_SEL
- 下一篇: mysql 停止服务内存_服务器莫名的内