如何跟客戶(hù)介紹網(wǎng)站建設(shè)和推廣域名查詢(xún)網(wǎng)址
目錄
- 數(shù)據(jù)庫(kù)
- 數(shù)據(jù)和信息
- Data數(shù)據(jù)
- 數(shù)據(jù)庫(kù)
- 數(shù)據(jù)庫(kù)管理系統(tǒng)
- 總結(jié)
- 常見(jiàn)的數(shù)據(jù)庫(kù)管理系統(tǒng)
- 關(guān)系型數(shù)據(jù)庫(kù)
- 連接查詢(xún)
- 交叉連接、笛卡爾積
- 內(nèi)連接
- 左連接
- 右連接
- 嵌套查詢(xún)
- Jar
- 在Java項(xiàng)目中使用.jar文件
- JDBC
- 核心接口
- 單表查詢(xún)
- SQL注入
- 簡(jiǎn)化JDBC
- 視圖View
- 創(chuàng)建視圖
- 使用視圖
- 刪除視圖
- 事務(wù)transaction
- 事務(wù)的特性ACID
- Atomicity原子性
- Consistency一致性
- Isolation隔離性
- Durability持久性
- 存儲(chǔ)引擎
數(shù)據(jù)庫(kù)
顧名思義,保存數(shù)據(jù)
數(shù)據(jù)和信息
Data數(shù)據(jù)
- 任何描述事物的文字或符號(hào)都可以稱(chēng)為數(shù)據(jù)。
- 軟件開(kāi)發(fā)就是為了收集數(shù)據(jù),從中篩選出有用的信息。
- 信息就是進(jìn)過(guò)分析篩選后的數(shù)據(jù)。
- 數(shù)據(jù)需要保存,保存的介質(zhì)有內(nèi)存或硬盤(pán)。
- 內(nèi)存中的數(shù)據(jù)是臨時(shí)的,隨著系統(tǒng)的關(guān)閉,數(shù)據(jù)也會(huì)消失。
- 硬盤(pán)中的數(shù)據(jù)是永久,就算系統(tǒng)關(guān)閉,數(shù)據(jù)依然保留。
- excel等文件保存數(shù)據(jù)是一種保存到硬盤(pán)中的途徑,
- 如果需要大量數(shù)據(jù)保存,文件系統(tǒng)就不再方便。
- 使用一個(gè)系統(tǒng)化的數(shù)據(jù)倉(cāng)庫(kù)才能高效地管理數(shù)據(jù)。
數(shù)據(jù)庫(kù)
- DataBase ,稱(chēng)為數(shù)據(jù)庫(kù),簡(jiǎn)稱(chēng)DB運(yùn)行在操作系統(tǒng)上,按照一定的數(shù)據(jù)結(jié)構(gòu),保存數(shù)據(jù)的倉(cāng)庫(kù)。是一個(gè)電子化的文件柜。
- 數(shù)據(jù)永久保存在硬盤(pán)中。
數(shù)據(jù)庫(kù)管理系統(tǒng)
- DataBase Manager System,簡(jiǎn)稱(chēng)DBMS
通常所說(shuō)的數(shù)據(jù)庫(kù),其實(shí)是指數(shù)據(jù)庫(kù)管理系統(tǒng),如MySQL、SQLServer、Oracle等。 - 是一種操作和管理數(shù)據(jù)庫(kù)的大型軟件,用于建立、使用和維護(hù)數(shù)據(jù)庫(kù)。
總結(jié)
數(shù)據(jù)Data需要永久保存在數(shù)據(jù)庫(kù)中
學(xué)號(hào)(字段) 姓名(字段) 專(zhuān)業(yè)(字段)
1001 小王 計(jì)算機(jī)
1002 小李 計(jì)算機(jī)
1003 小趙 計(jì)算機(jī)
數(shù)據(jù)庫(kù)DB是運(yùn)行在操作系統(tǒng)上的一個(gè)軟件
數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS是管理數(shù)據(jù)庫(kù)的一個(gè)軟件
學(xué)習(xí)數(shù)據(jù)庫(kù)就是學(xué)習(xí)如何使用DBMS創(chuàng)建、使用數(shù)據(jù)倉(cāng)庫(kù)來(lái)管理數(shù)據(jù)
常見(jiàn)的數(shù)據(jù)庫(kù)管理系統(tǒng)
關(guān)系型數(shù)據(jù)庫(kù)
- 關(guān)系型數(shù)據(jù)庫(kù)是主流的數(shù)據(jù)庫(kù)類(lèi)型。
- 數(shù)據(jù)通過(guò)行row和列column的形式(表格)保存。
每行稱(chēng)為一條記錄。
每列稱(chēng)為一個(gè)字段。
連接查詢(xún)
交叉連接、笛卡爾積
將兩張表中的數(shù)據(jù)兩兩組合,得到的結(jié)果就是交叉連接的結(jié)果,也稱(chēng)為笛卡爾積。
集合A:{a,b}
集合B:{1,2,3}
集合A x 集合B = {a1,a2,a3,b1,b2,b3}
select * from 表1,表2;
select * from 表1 cross join 表2;
select * from 表1 inner join 表2;
以上三種方式都能將兩張表中的數(shù)據(jù)互相組合,其中有很多無(wú)效數(shù)據(jù)。
內(nèi)連接
在交叉連接的基礎(chǔ)上,篩選出關(guān)聯(lián)的數(shù)據(jù)。
select * from 表1,表2 where 表1.字段 = 表2.字段;
select * from 表1 inner join 表2 on 表1.字段 = 表2.字段;-- 如查詢(xún)所有圖書(shū)詳情和類(lèi)型名
select * from 圖書(shū)詳情表 t1,圖書(shū)類(lèi)型表 t2 where t1.類(lèi)型編號(hào) = t2.類(lèi)型編號(hào);select * from 圖書(shū)詳情表 t1 inner join 圖書(shū)類(lèi)型表 t2 on t1.類(lèi)型編號(hào) = t2.類(lèi)型編號(hào);
- 通常是通過(guò)主表的主鍵字段關(guān)聯(lián)從表的外鍵字段
- 如果兩張表中關(guān)聯(lián)的字段名一致,一定要通過(guò)"表名.字段名"進(jìn)行區(qū)分,通常還會(huì)給表重命名
- 如果使用inner join,帶條件時(shí)需要加入where子句;如果使用,隔開(kāi)多個(gè)表,帶條件時(shí)需要使用and拼接條件
- 內(nèi)連接只會(huì)顯示兩張表中有關(guān)聯(lián)的數(shù)據(jù)
左連接
-- 保證左表數(shù)據(jù)顯示完整的情況下,關(guān)聯(lián)右表中的數(shù)據(jù),沒(méi)有關(guān)聯(lián)的用null表示
select * from 表1 left join 表2 on 表1.字段 = 表2.字段
-- 最終顯示表1中的所有數(shù)據(jù),關(guān)聯(lián)表2中的數(shù)據(jù)
右連接
-- 保證右表數(shù)據(jù)顯示完整的情況下,關(guān)聯(lián)左表中的數(shù)據(jù),沒(méi)有關(guān)聯(lián)的用null表示
select * from 表1 right join 表2 on 表1.字段 = 表2.字段
-- 最終顯示表2中的所有數(shù)據(jù),關(guān)聯(lián)表1中的數(shù)據(jù)
嵌套查詢(xún)
將查詢(xún)出的結(jié)果繼續(xù)使用在另一個(gè)查詢(xún)語(yǔ)句中
-- 查詢(xún)價(jià)格最低的圖書(shū)信息
select * from book_info where book_price = (select min(book_price) from book_info)
-- 按類(lèi)型分組,查詢(xún)每組中圖書(shū)價(jià)格大于平均價(jià)格的圖書(shū)
select * from book_info bi inner join
(select type_id,avg(book_price) as avg from book_info group by type_id)temp
on bi.type_id = temp.type_id where book_price > avg
Jar
以.jar為后綴的文件,稱(chēng)為Java的歸檔文件。保存的是Java的字節(jié)碼.class文件
在Java程序中導(dǎo)入某個(gè).jar文件后,就能使用其中的.class文件。
在Java項(xiàng)目中使用.jar文件
1.創(chuàng)建一個(gè)Java項(xiàng)目,在其中最好新建一個(gè)文件夾,將.jar文件保存在里面
2.在.jar文件上右鍵,點(diǎn)擊“add as library”
JDBC
Java DataBase Connectivity Java數(shù)據(jù)庫(kù)連接
用于Java程序連接不同的數(shù)據(jù)庫(kù)。
實(shí)際是Java中定義的相關(guān)數(shù)據(jù)庫(kù)連接時(shí)所需的接口的集合,不同的數(shù)據(jù)庫(kù)對(duì)其進(jìn)行了實(shí)現(xiàn)。
核心接口
-
Connection:用于設(shè)置連接的數(shù)據(jù)庫(kù)的地址、賬號(hào)、密碼
-
PreparedStatement:用于預(yù)處理、執(zhí)行SQL語(yǔ)句
-
**ResultSet:**用于保存查詢(xún)后的數(shù)據(jù)
以上接口都來(lái)自于java.sql包中
單表查詢(xún)
import java.sql.*;public class Main {public static void main(String[] args) throws ClassNotFoundException, SQLException {//連接mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)單表查詢(xún)//1.加載連接MySQL的驅(qū)動(dòng)Class.forName("com.mysql.cj.jdbc.Driver");//2.連接數(shù)據(jù)庫(kù),提供要連接的數(shù)據(jù)庫(kù)的URL、用戶(hù)名、密碼String url = "jdbc:mysql://localhost:3306/gamedb?serverTimezone=Asia/Shanghai";Connection conn = DriverManager.getConnection(url, "root", "root");//3.構(gòu)造查詢(xún)的sql語(yǔ)句String sql = "select * from hero";//4.處理sql語(yǔ)句PreparedStatement pst = conn.prepareStatement(sql);//5.處理執(zhí)行sql語(yǔ)句后的結(jié)果ResultSet rs = pst.executeQuery();//6.循環(huán)遍歷讀取查詢(xún)后的數(shù)據(jù)while (rs.next()) {//根據(jù)字段名獲取int id = rs.getInt("id");//根據(jù)字段順序獲取String name = rs.getString(2);String sex = rs.getString(3);int price = rs.getInt(4);String makeTime = rs.getString(5);String position = rs.getString(6);System.out.println(id+"\t"+name+"\t"+sex+"\t"+price+"\t"+makeTime+"\t"+position);}//7.關(guān)閉連接rs.close();pst.close();conn.close();}
}
SQL注入
在構(gòu)造sql語(yǔ)句時(shí),如果使用字符串拼接的方式構(gòu)造可變的sql語(yǔ)句,可能會(huì)造成sql注入的風(fēng)險(xiǎn),導(dǎo)致執(zhí)行不是預(yù)期的sql語(yǔ)句
-- 如刪除的sql String sql="delete from 表 where 主鍵="+參數(shù);
-- 實(shí)際傳遞 '' or 1=1
delete from 表 where 主鍵= '' or 1=1
-- 導(dǎo)致條件永遠(yuǎn)成立,最終刪除了所有數(shù)據(jù)-- 查詢(xún)的sql String sql="select * from 表 where name="+name +"and pwd="+pwd;
-- 實(shí)際第一個(gè)參數(shù)傳遞 '' or 1=1 --
select * from 表 where name = '' or 1=1 -- pwd=
-- 導(dǎo)致第二個(gè)參數(shù)被注釋,第一個(gè)參數(shù)永遠(yuǎn)成立
在構(gòu)造sql語(yǔ)句時(shí),使用?占位,通過(guò)preparestatement方法防止sql注入的風(fēng)險(xiǎn)
簡(jiǎn)化JDBC
DBUtil數(shù)據(jù)庫(kù)工具類(lèi)
import java.sql.*;/** 定義數(shù)據(jù)庫(kù)工具類(lèi),簡(jiǎn)化JDBC操作* 可以簡(jiǎn)化的操作* 1.加載驅(qū)動(dòng) √* 2.連接數(shù)據(jù)庫(kù) √* 6.關(guān)閉 √* */
public class DBUtil {/** 定義靜態(tài)代碼塊用于加載驅(qū)動(dòng)* */static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {System.out.println("驅(qū)動(dòng)不存在" + e);}}//定義靜態(tài)常量保存連接數(shù)據(jù)庫(kù)的字符串private final static String URL = "jdbc:mysql://localhost:3306/gamedb?serverTimezone=Asia/Shanghai";private final static String USERNAME = "root";private final static String PASSWORD = "root";/** 定義靜態(tài)方法獲取連接對(duì)象* */public static Connection getConn() {Connection connection = null;try {connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);} catch (SQLException e) {System.out.println("連接數(shù)據(jù)庫(kù)信息異常" + e);}return connection;}/** 定義靜態(tài)方法釋放資源* */public static void release(Connection conn, PreparedStatement pst, ResultSet rs) {//使用了哪個(gè)接口就關(guān)閉那個(gè)接口try {if (rs != null) {rs.close();}if (pst != null) {pst.close();}if (conn != null) {conn.close();}} catch (SQLException e) {System.out.println("關(guān)閉異常" + e);}}
}
視圖View
視圖可以當(dāng)做數(shù)據(jù)庫(kù)中的一個(gè)臨時(shí)表,保存一些較為復(fù)雜的查詢(xún)后的結(jié)果。
之后可以直接通過(guò)該視圖查詢(xún)數(shù)據(jù),不需要再次編寫(xiě)復(fù)雜的sql語(yǔ)句。
視圖同時(shí)可以隱藏一些查詢(xún)細(xì)節(jié),定制查詢(xún)數(shù)據(jù)。
創(chuàng)建視圖
create view 視圖名 as
查詢(xún)的sql語(yǔ)句;
使用視圖
修改視圖中的數(shù)據(jù),會(huì)直接修改原始表中的數(shù)據(jù)。
select * from 視圖名;
刪除視圖
drop view 視圖名;
事務(wù)transaction
事務(wù)是由一組sql語(yǔ)句組成的執(zhí)行單元,這些sql之間一般都互相依賴(lài)。
如A給B轉(zhuǎn)賬
1.update 表 set money = money-1000 where id=1
2.update 表 set money = money+1000 where id=2
以上兩句sql組成了一個(gè)轉(zhuǎn)賬的事務(wù)。一個(gè)事務(wù)要么全部執(zhí)行,要么全部不執(zhí)行。
事務(wù)的特性ACID
Atomicity原子性
事務(wù)是最小的執(zhí)行單元,要么全部執(zhí)行,要么全部不執(zhí)行。
Consistency一致性
事務(wù)執(zhí)行前后,必須讓所有數(shù)據(jù)保持一致?tīng)顟B(tài)。(總體數(shù)據(jù)守恒)
create view 視圖名 as
查詢(xún)的sql語(yǔ)句;
select * from 視圖名;
drop view 視圖名;
Isolation隔離性
多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)應(yīng)該互相隔離,互不影響。
Durability持久性
事務(wù)一旦提交,對(duì)數(shù)據(jù)的改變是永久的。
存儲(chǔ)引擎
- MySQL5.5版本之前,默認(rèn)使用MyIsam存儲(chǔ)引擎,不支持事務(wù)
- MySQL5.5版本之后,默認(rèn)使用InnoDB存儲(chǔ)引擎,支持事務(wù)