<meta charset="utf-8">
基礎(chǔ)查詢
select 查詢列表 from 表名;
USE myemployees; //最好寫上
1.查詢表中的單個字段
SELECT last_name FROM employees;
2.查詢表中的多個字段
SELECT last_name,salary,email FROM employees;
3.查詢表中的所有字段
方式一:
SELECT
employee_id
,
first_name
,
last_name
,
phone_number
,
last_name
,
job_id
,
phone_number
,
job_id
,
salary
,
commission_pct
,
manager_id
,
department_id
,
hiredate
FROM
employees ;
方式二:
SELECT * FROM employees;
4.查詢常量值
SELECT 100;
SELECT 'john';
5.查詢表達(dá)式
SELECT 100%98;
6.查詢函數(shù)
SELECT VERSION();
7.起別名
方式一:使用as
SELECT 100%98 AS 結(jié)果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
方式二:使用空格
SELECT last_name 姓,first_name 名 FROM employees;
案例:查詢salary奏属,顯示結(jié)果為 out put //如果要改的別名中含有關(guān)鍵字就用雙引號包裹.
SELECT salary AS "out put" FROM employees;
8.去重關(guān)鍵詞 DISTINCT
案例:查詢員工表中涉及到的所有的部門編號
SELECT DISTINCT department_id FROM employees;
9.+號的作用
/*
mysql中的+號:
僅僅只有一個功能:運算符
①若加號兩邊都為數(shù)值型渠啤,則兩邊相加
②若有字符型則轉(zhuǎn)換為數(shù)值型相加谅猾,無法識別字符則視為0相加
③若有null相加則為null
*/
10、連接關(guān)鍵字 CONCAT():將括號中的內(nèi)容連接丙曙。可以連接字符串 "xxxx".和null連接為null
SELECT CONCAT('a','b','c') AS 結(jié)果;
SELECT
CONCAT(last_name,first_name) AS 姓名
FROM
employees;
11巾兆、 ifnull(表 , a)關(guān)鍵字:若表中一行內(nèi)容位null則返回 a 如捅。
select ifnull(last_name , a) from employees;
_______________________________________________________________________________進(jìn)階2:條件查詢
語法:
select
查詢列表
from
表名
where
篩選條件;
分類:
一、按條件表達(dá)式篩選
簡單條件運算符:> < = != <> >= <=
二样傍、按邏輯表達(dá)式篩選
邏輯運算符:
作用:用于連接條件表達(dá)式
&&和and:兩個條件都為true横缔,結(jié)果為true,反之為false
||或or: 只要有一個條件為true衫哥,結(jié)果為true茎刚,反之為false
!或not: 如果連接的條件本身為false,結(jié)果為true撤逢,反之為false
三膛锭、模糊查詢
/*
like
between and
in()
is null is not null
<=>
*/
1.like
/*
特點:
①一般和通配符搭配使用
通配符:
% 任意多個字符,包含0個字符捌斧。%向外字符可以為任意字符
_ 任意單個字符。一個_代表此位置可以代表任何字符
案例1:查詢員工名中包含字符a的員工信息
select
from
employees
where
last_name like '%a%';
案例2:查詢員工名中第三個字符為e泉沾,第五個字符為a的員工名和工資
select
last_name,
salary
FROM
employees
WHERE
last_name LIKE '__n_l%';
案例3:查詢員工名中第二個字符為_的員工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_';
2捞蚂、.between and
①使用between and 可以提高語句的簡潔度
②包含臨界值
③兩個臨界值不要調(diào)換順序
案例1:查詢員工編號在100到120之間的員工信息
SELECT
FROM
employees
WHERE
employee_id BETWEEN 120 AND 100;//前后順序不能顛倒,AND之前為大于 之后為小于.
3跷究、in
含義:判斷某字段的值是否屬于in列表中的某一項
特點:
①使用in提高語句簡潔度
②in列表的值類型必須一致或兼容
③in列表中不支持通配符
案例:查詢員工的工種編號是 IT_PROG姓迅、AD_VP、AD_PRES中的一個員工名和工種編號
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');
4俊马、is null
=或<>不能用于判斷null值
is null或is not null 可以判斷null值
5丁存、安全等于 <=>
排序查詢
語法:
select 查詢列表
from 表名
【where 篩選條件】
order by 排序的字段或表達(dá)式 + asc 或 desc 默認(rèn)為升序;
1、asc代表的是升序柴我,可以省略
desc代表的是降序
2解寝、order by子句可以支持 單個字段、別名艘儒、表達(dá)式聋伦、函數(shù)、多個字段
3界睁、order by子句在查詢語句的最后面觉增,除了limit子句
*/
1、按單個字段排序
SELECT * FROM employees ORDER BY salary DESC;
2翻斟、添加篩選條件再排序
案例:查詢部門編號>=90的員工信息逾礁,并按員工編號降序
SELECT *
FROM employees
WHERE department_id>=90
ORDER BY employee_id DESC;
3、按表達(dá)式排序
案例:查詢員工信息 按年薪降序
SELECT ,salary12*(1+IFNULL(commission_pct,0))
FROM employees
ORDER BY salary12(1+IFNULL(commission_pct,0)) DESC;
4访惜、按別名排序
案例:查詢員工信息 按年薪升序
SELECT ,salary12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 ASC;
5嘹履、按函數(shù)排序
案例:查詢員工名,并且按名字的長度降序
SELECT LENGTH(last_name),last_name
FROM employees
ORDER BY LENGTH(last_name) DESC;
6债热、按多個字段排序
案例:查詢員工信息砾嫉,要求先按工資降序,再按employee_id升序
SELECT *
FROM employees
ORDER BY salary DESC,employee_id ASC;
常見函數(shù)(方法)
1阳柔、基礎(chǔ)函數(shù)
1焰枢、字符函數(shù) LENGTH : LENGTH('john')。
2舌剂、拼接函數(shù) CONCAT : CONCAT(last_name,'_',first_name)济锄。
3、大小寫轉(zhuǎn)換函數(shù) upper霍转、lower : UPPER('john'); LOWER('joHn')荐绝。
4、 截取函數(shù) substr避消、substring :
SUBSTR('李莫愁愛上了陸展元',7) out_put; //從7號位置開始截取
SUBSTR('李莫愁愛上了陸展元',1,n) out_put;//從1號索引開始截取N個字段(索引1計入)
5低滩、查找字符函數(shù)instr: 返回子串第一次出現(xiàn)的索引召夹,如果找不到返回0, INSTR('楊不殷','殷');
6恕沫、 刪除兩邊函數(shù) trim() :
LENGTH(TRIM(' 張翠山 ')) AS out_put;
TRIM('a' FROM 'aaaaaa張aa翠aaaa') AS out_put;結(jié)果為 張aa翠监憎。不刪除內(nèi)容體間。
7婶溯、填充函數(shù) lpad左填充鲸阔、rpad右填充 : LPAD( 被填充體 , 填充后字符長度 , '填充內(nèi)容 ')
8、替換函數(shù) replace: REPLACE('被替換體','被替換的內(nèi)容', '替換內(nèi)容' )
2迄委、數(shù)學(xué)函數(shù)
1、四舍五入函數(shù) round : ROUND(-1.55);
2叙身、向上取整函數(shù) ceil : SELECT CEIL(-1.02);
3渔扎、向下取整函數(shù) floor : SELECT FLOOR(-9.99);
4、 截斷函數(shù) truncate : TRUNCATE(1.69999,1); 保留小數(shù)點后1位
5信轿、 取余函數(shù) : MOD(10,-3);
6晃痴、 隨機(jī)函數(shù) : rand() 從0到1之間取隨機(jī)數(shù)[0.0, 1.0) 浮點型
3、日期函數(shù)
1虏两、返回當(dāng)前系統(tǒng)旟+時間 now
SELECT NOW();
2愧旦、 返回當(dāng)前系統(tǒng)日期,不包含時間 curdate
SELECT CURDATE();
3定罢、返回當(dāng)前時間,不包含日期 curtime
SELECT CURTIME();
4旁瘫、 可以獲取指定的部分祖凫,年、月酬凳、日惠况、小時、分鐘宁仔、秒
SELECT YEAR(NOW()) 年;
SELECT YEAR('1998-1-1') 年;
SELECT YEAR(hiredate) 年 FROM employees;
SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月;
5稠屠、 字符轉(zhuǎn)date日期 :str_to_date(字符日期,轉(zhuǎn)化格式) 如 str_to_date('9-13-1999','%m-%d-%Y')
date日期轉(zhuǎn)字符 :date_format(日期 , 轉(zhuǎn)化格式 ) 如 DATE_format("2018/6/6","%Y年%m月%d日")
[圖片上傳失敗...(image-9c695e-1570969347993)]
4、流程控制函數(shù)
1翎苫、if 函數(shù)
SELECT IF(10<5,'大','小');
2权埠、case 函數(shù)
格式一 :
case 需要判斷的字段貨表達(dá)式
when X then 顯示體
when Z then 顯示體
else 顯示體
end (表示結(jié)束)
格式二 :
case
when 需要判斷體 then 顯示體
when 需要判斷體 then 顯示體
else 顯示體
end (表示結(jié)束)
5、分組函數(shù)
分類:
sum 求和煎谍、avg 平均值攘蔽、max 最大值 、min 最小值 呐粘、count 計算個數(shù)
特點:
1满俗、sum转捕、avg一般用于處理數(shù)值型
max、min唆垃、count可以處理任何類型
2五芝、以上分組函數(shù)都忽略null值
3、可以和distinct搭配實現(xiàn)去重的運算
4辕万、count函數(shù)的單獨介紹枢步,一般使用count(*)用作統(tǒng)計行數(shù)
5、count函數(shù)的詳細(xì)介紹
SELECT COUNT(salary) FROM employees;
SELECT COUNT(*) FROM employees;
SELECT COUNT(1) FROM employees;
效率:
MYISAM存儲引擎下 蓄坏,COUNT(*)的效率高
INNODB存儲引擎下价捧,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
6涡戳、和分組函數(shù)一同查詢的字段有限制
SELECT AVG(salary),employee_id FROM employees;
以最少函數(shù)位基準(zhǔn)展現(xiàn)表
分組查詢
group by + 分組類型(可以是函數(shù)结蟋、表達(dá)式等,一般使用單個類型)
后篩選 having渔彰,(前篩選為where)
完成顯示后在查詢嵌屎,然后再顯示表,在排序關(guān)鍵詞 order by 之前
連接查詢
內(nèi)連接
等值連接查詢
92版寫法
SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id
=departments.department_id
;
99版寫法
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d ON e.department_id
= d.department_id
非等值連接查詢
查詢所有員工的工資和其工資的級別
92版寫法
SELECT salary,grade_level
FROM employees,job_grades
WHERE salary BETWEEN lowest_sal AND highest_sal
99版寫法
SELECT salary,grade_level
FROM employees e
INNER JOIN job_grades J ON e.salary BETWEEN lowest_sal AND highest_sal
自連接查詢
92版寫法
SELECT e.last_name
,m.last_name
FROM employees e,employees m
WHERE e.employee_id
= m.manager_id
99版寫法
SELECT e.last_name
,m.last_name
FROM employees e
INNER JOIN employees m ON e.employee_id
= m.manager_id
外連接
左連接
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.department_id
= e.department_id
WHERE e.employee_id
IS NULL;
右連接
SELECT d.*,e.employee_id
FROM employees e
RIGHT OUTER JOIN departments d
ON d.department_id
= e.department_id
WHERE e.employee_id
IS NULL;
全連接
SELECT b.,bo.
FROM beauty b
FULL OUTER JOIN boys bo
ON b.boyfriend_id
= bo.id;
交叉連接:查詢N個表鏈接的大表
SELECT e., j.
FROM employees e
CROSS JOIN jobs j
子查詢
用于where后面
標(biāo)量子查詢
列子量查詢
用于select后面
用于顯示
用于from后面
引用的表是 子查詢展現(xiàn)的內(nèi)容恍涂,需要給表加名稱
用于exists后面
exists(子查詢語句) 返回此查詢是否存在,存在返回true(1)宝惰,不存在返回false(0)
not exists(子查詢語句) 與上相反
分頁查詢
用于查詢語句最末尾
select 。再沧。尼夺。。order by xxx limit 索引位置(默認(rèn)從0開始炒瘸,可省略) , 讀取條數(shù)
每頁起始索引公式 (頁數(shù) - 1) * 每頁總條數(shù)
聯(lián)合查詢
聯(lián)合查詢 union
聯(lián)合 合并:將多條查詢語句的結(jié)果合并成一個結(jié)果
語法:
select 查詢語句1
union
select 查詢語句2
union
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;
將表合并和同列淤堵,合并列數(shù)需要一樣,默認(rèn)去重(UNION ALL 為保留重復(fù))
表格中數(shù)據(jù)的增刪改
增(插入)
語法:
insert into 表名(列名,...)
values(值1,...),(值1,...); 支持多條插入顷扩,支持子查詢插入
語法:
insert into 表名
set 列名=值,列名=值,... 不可多條插入拐邪,不支持子查詢
補充:在自增列中默認(rèn)增加在列的最末尾,自增列插入是有順序的。
單條增加語句只能給一個表增加內(nèi)容隘截,不支持多表
改
update 表名
set 列=新值,列=新值,...
where 篩選條件;
【補充】修改多表的記錄
語法:
sql92語法:
update 表1 別名,表2 別名
set 列=值,...
where 連接條件
and 篩選條件;
sql99語法:
update 表1 別名
inner扎阶、lef、right join 表2 別名
on 連接條件
set 列=值,...
where 篩選條件;
刪
delete from 表名 where 篩選條件
2婶芭、多表的刪除【補充】
sql92語法:
delete 表1的別名,表2的別名
from 表1 別名,表2 別名
where 連接條件
and 篩選條件;
sql99語法:
delete 表1的別名,表2的別名
from 表1 別名
inner|left|right join 表2 別名 on 連接條件
where 篩選條件;
清空刪除:truncate table
語法: 清空表中內(nèi)容东臀,如果在自增表格中增(插入),自增列從1開始
truncate table 表名;
清空刪除delete:
語法: 清空表中內(nèi)容雕擂,如果在自增表格中增(插入),自增列從原表最后一條開始計算如最后一條為N啡邑,則從N+1開始
delete from 表名;
————————————————————————————————————————————
庫和表的管理
一井赌、庫的管理
創(chuàng)建谤逼、修改贵扰、刪除
二、表的管理
創(chuàng)建流部、修改戚绕、刪除
一、庫的管理
1枝冀、庫的創(chuàng)建
語法:
create database if not exists(判斷是否存在) 庫名;
2舞丛、庫的修改
RENAME DATABASE books TO 新庫名;(修改庫動作一般不使用)
ALTER DATABASE books CHARACTER SET gbk;(更改庫的字符集)
3、庫的刪除
DROP DATABASE IF EXISTS(判斷是否存在) 庫名;
二果漾、表的管理
1.表的創(chuàng)建
語法:
create table 表名(
列名 列的類型【(長度) 約束】,
列名 列的類型【(長度) 約束】,
列名 列的類型【(長度) 約束】,
...
列名 列的類型【(長度) 約束】
)
2.表的修改
語法
①修改列名
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
②修改列的類型或約束
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
③添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;
④刪除列
ALTER TABLE book_author DROP COLUMN annual;
⑤修改表名
ALTER TABLE author RENAME TO book_author;
DESC book;
3.表的刪除
DROP TABLE IF EXISTS book_author;
SHOW TABLES;
通用的寫法:
DROP DATABASE IF EXISTS 舊庫名;
CREATE DATABASE 新庫名;
DROP TABLE IF EXISTS 舊表名;
CREATE TABLE 表名();
4.表的復(fù)制
INSERT INTO author VALUES
(1,'村上春樹','日本'),
(2,'莫言','中國'),
(3,'馮唐','中國'),
(4,'金庸','中國');
1.僅僅復(fù)制表的結(jié)構(gòu)
CREATE TABLE copy LIKE author;
2.復(fù)制表的結(jié)構(gòu)+數(shù)據(jù)
CREATE TABLE copy2
SELECT * FROM author;
只復(fù)制部分?jǐn)?shù)據(jù)
CREATE TABLE copy3
SELECT id,au_name
FROM author
WHERE nation='中國';
僅僅復(fù)制某些字段結(jié)構(gòu)
CREATE TABLE copy4
SELECT id,au_name
FROM author
WHERE 0;
————————————————————————————————————————————
常見的數(shù)據(jù)類型
數(shù)值型
整型
小數(shù):
定點數(shù)
浮點數(shù)
字符型
較短的文本:char球切、varchar
較長的文本:text、blob(較長的二進(jìn)制數(shù)據(jù))
日期型
分類:
tinyint绒障、smallint吨凑、mediumint、int/integer户辱、bigint
1 2 3 4 8
特點:
① 如果不設(shè)置無符號還是有符號鸵钝,默認(rèn)是有符號,如果想設(shè)置無符號庐镐,需要添加unsigned關(guān)鍵字
② 如果插入的數(shù)值超出了整型的范圍,會報out of range異常恩商,并且插入臨界值
③ 如果不設(shè)置長度,會有默認(rèn)的長度
長度代表了顯示的最大寬度必逆,如果不夠會用0在左邊填充怠堪,但必須搭配zerofill使用!
1.如何設(shè)置無符號和有符號
DROP TABLE IF EXISTS tab_int;
CREATE TABLE tab_int(
t1 INT(7) ,有符號(默認(rèn))
t2 INT(7) unsigned 無符號
);
二名眉、小數(shù)
分類:
1.浮點型
float(M,D)
double(M,D)
2.定點型
dec(M研叫,D)
decimal(M,D)
特點:
①
M:整數(shù)部位+小數(shù)部位
D:小數(shù)部位
如果超過范圍,則插入臨界值
②
M和D都可以省略
如果是decimal璧针,則M默認(rèn)為10,D默認(rèn)為0
如果是float和double渊啰,則會根據(jù)插入的數(shù)值的精度來決定精度
③定點型的精確度較高探橱,如果要求插入數(shù)值的精度較高如貨幣運算等則考慮使用
原則:
所選擇的類型越簡單越好,能保存數(shù)值的型越小越好绘证、
三隧膏、字符型
較短的文本:
char
varchar
其他:
binary和varbinary用于保存較短的二進(jìn)制
enum用于保存枚舉
set用于保存集合
較長的文本:
text
blob(較大的二進(jìn)制)
特點:
寫法 M的意思 特點 空間的耗費 效率
char char(M) 最大的字符數(shù),可以省略嚷那,默認(rèn)為1 固定長度的字符 比較耗費 高
varchar varchar(M) 最大的字符數(shù)胞枕,不可以省略 可變長度的字符 比較節(jié)省 低
ENUM類型
CREATE TABLE tab_char(
c1 ENUM('a','b','c')
);
INSERT INTO tab_char VALUES('a');
INSERT INTO tab_char VALUES('b');
INSERT INTO tab_char VALUES('c');
INSERT INTO tab_char VALUES('m');
INSERT INTO tab_char VALUES('A');
四、日期型
分類:
date保存日期
time 只保存時間
year只保存年
datetime保存日期+時間
timestamp保存日期+時間
特點:
字節(jié) 范圍 時區(qū)等的影響
datetime 8 1000——9999 不受
timestamp 4 1970-2038 受 (比較好用)
常見約束
分類:六大約束
NOT NULL:非空魏宽,用于保證該字段的值不能為空
比如姓名腐泻、學(xué)號等
DEFAULT:默認(rèn)决乎,用于保證該字段有默認(rèn)值
比如性別
PRIMARY KEY:主鍵,用于保證該字段的值具有唯一性派桩,并且非空
比如學(xué)號构诚、員工編號等
UNIQUE:唯一鍵,用于保證該字段的值具有唯一性铆惑,可以為空
比如座位號
CHECK:檢查約束【mysql中不支持】
比如年齡范嘱、性別
foreign key references:外鍵埂奈,用于限制兩個表的關(guān)系纸兔,用于保證該字段的值必須來自于主表的關(guān)聯(lián)列的值,關(guān)聯(lián)對象必須是一個鍵(包括外鍵在內(nèi))
添加約束的時機(jī):
1.創(chuàng)建表時
2.修改表時
約束的添加分類:
列級約束:
六大約束語法上都支持麻车,但外鍵約束沒有效果
表級約束:
除了非空撕阎、默認(rèn)受裹,其他的都支持
主鍵和唯一的大對比:primary key 與 unique
保證唯一性 是否允許為空 一個表中可以有多少個 是否允許組合
主鍵 √ × 至多有1個 √,但不推薦
唯一 √ √ 可以有多個 √闻书,但不推薦
外鍵:
1名斟、要求在從表設(shè)置外鍵關(guān)系
2、從表的外鍵列的類型和主表的關(guān)聯(lián)列的類型要求一致或兼容魄眉,名稱無要求
3砰盐、主表的關(guān)聯(lián)列必須是一個key(一般是主鍵或唯一)
4、插入數(shù)據(jù)時坑律,先插入主表岩梳,再插入從表
刪除數(shù)據(jù)時,先刪除從表晃择,再刪除主表
CREATE TABLE 表名(
字段名 字段類型 列級約束 ,
字段名 字段類型 ,
表級約束
)
CREATE DATABASE students; 查看表約束類型
一冀值、創(chuàng)建表時添加約束
1.添加列級約束
語法:
直接在字段名和類型后面追加 約束類型即可。
DROP TABLE stuinfo;
CREATE TABLE stuinfo(
id INT PRIMARY KEY, #主鍵
stuName VARCHAR(20) NOT NULL UNIQUE, #非空
gender CHAR(1) CHECK(gender='男' OR gender ='女'), #檢查
seat INT UNIQUE, #唯一
age INT DEFAULT 18, #默認(rèn)約束
majorId INT REFERENCES major(id) #外鍵
);
查看stuinfo中的所有索引宫屠,包括主鍵列疗、外鍵、唯一
SHOW INDEX FROM stuinfo;
2.添加表級約束 不支持非空浪蹂、默認(rèn) (not null 抵栈、default)
語法:在各個字段的最下面
【constraint 約束名】可省略 約束類型(字段名)
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id), #主鍵
CONSTRAINT uq UNIQUE(seat), #唯一鍵
CONSTRAINT ck CHECK(gender ='男' OR gender = '女'), #檢查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外鍵
);
二、修改表時添加約束(無法添加 檢查約束check)
1坤次、添加列級約束
alter table 表名 modify column 字段名 字段類型 新約束;
2古劲、添加表級約束
alter table 表名 add 【constraint 約束名】(可省略) 約束類型(字段名) 【外鍵的引用】;
1.添加主鍵
①列級約束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
②表級約束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
2.添加唯一
①列級約束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
②表級約束
ALTER TABLE stuinfo ADD UNIQUE(seat)
3.添加非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
4.添加默認(rèn)約束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
5添加外鍵
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
三、修改表時刪除約束
1.刪除非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
2.刪除默認(rèn)約束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;
3.刪除主鍵
ALTER TABLE stuinfo DROP PRIMARY KEY;
4.刪除唯一
ALTER TABLE stuinfo DROP INDEX seat;
5.刪除外鍵
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
————————————————————————————————————————————
標(biāo)識列:auto_increment
又稱為自增長列
含義:可以不用手動的插入值缰猴,系統(tǒng)提供默認(rèn)的序列值,
特點:
1产艾、只能與鍵搭配
2、一個表只能有一個自增列
3、標(biāo)識列的類型只能是數(shù)值型
4闷堡、標(biāo)識列可以通過 SET auto_increment_increment=3設(shè)置步長;可以通過手動插入值,設(shè)置起始值
5隘膘、被標(biāo)識列不能與默認(rèn)約束(defult)共存
一、創(chuàng)建表時設(shè)置標(biāo)識列
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT ,
NAME FLOAT UNIQUE AUTO_INCREMENT,
seat INT
);
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');null即從索引最后開始添加
INSERT INTO tab_identity(NAME) VALUES('lucy');效果同上;說明主鍵若為標(biāo)識列則能被省略可以省略
SHOW VARIABLES LIKE '%auto_increment%';
SET auto_increment_increment=3; 設(shè)置每次自增的值
————————————————————————————————————————————
TCL
Transaction Control Language 事務(wù)控制語言
事務(wù):
一個或一組sql語句組成一個執(zhí)行單元缚窿,這個執(zhí)行單元要么全部執(zhí)行棘幸,要么全部不執(zhí)行。
事務(wù)的特性:
ACID
原子性:一個事務(wù)不可再分割倦零,要么都執(zhí)行要么都不執(zhí)行
一致性:一個事務(wù)執(zhí)行會使數(shù)據(jù)從一個一致狀態(tài)切換到另外一個一致狀態(tài)
隔離性:一個事務(wù)的執(zhí)行不受其他事務(wù)的干擾
持久性:一個事務(wù)一旦提交误续,則會永久的改變數(shù)據(jù)庫的數(shù)據(jù).
事務(wù)的創(chuàng)建
步驟1:開啟事務(wù)
設(shè)置隔離級別
set session|global transaction isolation level 設(shè)置隔離級別;(默認(rèn)為第二級別,只受幻讀影響,可省略)
set autocommit=0; 關(guān)閉自動提交
start transaction; 開啟事務(wù)(,mysql中必須寫,其他數(shù)據(jù)庫中可選)
步驟2:編寫事務(wù)中的sql語句(select insert update delete)
語句1;
語句2;
...
步驟3:結(jié)束事務(wù)
commit;提交事務(wù)
or
rollback;回滾事務(wù),返回到上一次的操作相當(dāng)于撤銷本次操作了扫茅;對于trancate操作無法回滾
savepoint + 節(jié)點名:設(shè)置保存點,可以設(shè)置在步驟2當(dāng)中搭配rollback to 節(jié)點嗎蹋嵌,返回到該節(jié)點
SHOW VARIABLES LIKE 'autocommit';查看是否關(guān)閉自動提交
事務(wù)的隔離級別:
臟讀 不可重復(fù)讀 幻讀
read uncommitted: √ √ √
read committed: × √ √
repeatable read: × × √
serializable × × ×
mysql中默認(rèn) 第三個隔離級別 repeatable read
oracle中默認(rèn)第二個隔離級別 read committed
查看隔離級別
select @@tx_isolation;
設(shè)置隔離級別
set session|global transaction isolation level 隔離級別;
視圖
含義:虛擬表,和普通表一樣使用
一葫隙、創(chuàng)建視圖
語法:
create view 視圖名
as
查詢語句;
1.查詢姓名中包含a字符的員工名栽烂、部門名和工種信息
①創(chuàng)建
CREATE VIEW myv1
AS
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON j.job_id = e.job_id;
②使用
SELECT * FROM myv1 WHERE last_name LIKE '%a%';
二、視圖的修改
方式一:
create or replace view 視圖名
as
查詢語句;
create or replace view myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
方式二:
語法:
alter view 視圖名
as
查詢語句;
ALTER VIEW myv3
AS
SELECT * FROM employees;
三恋脚、刪除視圖
語法:drop view 視圖名,視圖名,...;
DROP VIEW emp_v1,emp_v2,myv3;
四腺办、查看視圖
DESC myv3;
SHOW CREATE VIEW myv3;
五、視圖的更新
對于視圖的delete糟描、updaet怀喉、inset操作會影響到原表(通常無法更新)
變量
系統(tǒng)變量:
全局變量
會話變量
自定義變量:
用戶變量
局部變量
一、系統(tǒng)變量
說明:變量由系統(tǒng)定義船响,不是用戶定義躬拢,屬于服務(wù)器層面
注意:全局變量需要添加global關(guān)鍵字,會話變量需要添加session關(guān)鍵字见间,如果不寫聊闯,默認(rèn)全局級別
使用步驟:
1、查看所有系統(tǒng)變量
show global|【session】variables;
2米诉、查看滿足條件的部分系統(tǒng)變量
show global|【session】 variables like '%char%';
3菱蔬、查看指定的系統(tǒng)變量的值
select @@global|【session】. 系統(tǒng)變量名;
4、為某個系統(tǒng)變量賦值
方式一:
set global|【session】系統(tǒng)變量名=值;
方式二:
set @@global|【session】. 系統(tǒng)變量名=值;
1》全局變量
作用域:針對于所有會話(連接)有效史侣,但不能跨重啟
2》會話變量
作用域:針對于當(dāng)前會話(連接)有效
二汗销、自定義變量
說明:變量由用戶自定義,而不是系統(tǒng)提供的
使用步驟:
1抵窒、聲明
2、賦值
3叠骑、使用(查看李皇、比較、運算等)
1》用戶變量
作用域:針對于當(dāng)前會話(連接)有效,作用域同于會話變量
賦值操作符:=或:=
①聲明并初始化
SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
②賦值(更新變量的值)
方式一:
SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
方式二:
SELECT 字段 INTO @變量名
FROM 表;
③使用(查看變量的值)
SELECT @變量名;
2》局部變量
作用域:僅僅在定義它的begin end塊中有效掉房,應(yīng)用在 begin end中的第一句話
①聲明
DECLARE 變量名 類型;
DECLARE 變量名 類型 DEFAULT 值;
②賦值(更新變量的值)
方式一:
SET 局部變量名=值;
SET 局部變量名:=值;
SELECT 局部變量名:=值;
方式二:
SELECT 字段 INTO 具備變量名
FROM 表;
③使用(查看變量的值)
SELECT 局部變量名;
用戶變量和局部變量的對比
作用域 定義位置 語法
用戶變量 當(dāng)前會話 會話的任何地方 加@符號茧跋,不用指定類型
局部變量 定義它的BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定類型
————————————————————————————————————————————
存儲過程
含義:一組預(yù)先編譯好的SQL語句的集合,理解成批處理語句
1卓囚、提高代碼的重用性
2瘾杭、簡化操作
3、減少了編譯次數(shù)并且減少了和數(shù)據(jù)庫服務(wù)器的連接次數(shù)哪亿,提高了效率
一粥烁、創(chuàng)建語法
CREATE PROCEDURE 存儲過程名(參數(shù)模式 參數(shù)名 參數(shù)類型)
BEGIN
存儲過程體(一組合法的SQL語句)
END
調(diào)用
CALL myp3('張飛','8888')$
二、in蝇棉、out讨阻、inout
in:
CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
BEGIN
SELECT bo.*
FROM boys bo
RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
WHERE b.name=beautyName;
END $
調(diào)用
CALL myp2('柳巖')$
out:
CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT)
BEGIN
SELECT boys.boyname ,boys.usercp INTO boyname,usercp
FROM boys
RIGHT JOIN
beauty b ON b.boyfriend_id = boys.id
WHERE b.name=beautyName ;
END $
調(diào)用
CALL myp7('小昭',@name,@cp)$
SELECT @name,@cp$
inout:
CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END $
調(diào)用
SET @m=10$
SET @n=20$
CALL myp8(@m,@n)$
SELECT @m,@n$
三、刪除存儲過程
drop procedure 存儲過程名
四篡殷、查看存儲過程的信息
SHOW CREATE PROCEDURE myp2;
函數(shù)
含義:一組預(yù)先編譯好的SQL語句的集合钝吮,理解成批處理語句
1、提高代碼的重用性
2板辽、簡化操作
3奇瘦、減少了編譯次數(shù)并且減少了和數(shù)據(jù)庫服務(wù)器的連接次數(shù),提高了效率
區(qū)別:
存儲過程:可以有0個返回劲弦,也可以有多個返回耳标,適合做批量插入、批量更新
函數(shù):有且僅有1 個返回瓶您,適合做處理數(shù)據(jù)后返回一個結(jié)果
一麻捻、創(chuàng)建語法
CREATE FUNCTION 函數(shù)名(參數(shù)名 參數(shù)類型) RETURNS 返回類型
BEGIN
函數(shù)體;
return ?;
END
注意:
2.函數(shù)體:如果return語句沒有放在函數(shù)體的最后也不報錯,但不建議
return 值;
3.函數(shù)體中僅有一句話呀袱,則可以省略begin end
4.使用 delimiter語句設(shè)置結(jié)束標(biāo)記
二贸毕、調(diào)用語法
SELECT 函數(shù)名(參數(shù)列表)
------------------------------案例演示----------------------------
1.無參有返回
案例:返回公司的員工個數(shù)
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;#定義局部變量
SELECT COUNT(*) INTO c#賦值
FROM employees;
RETURN c;
END $
調(diào)用
SELECT myf1()
三、查看函數(shù)
SHOW CREATE FUNCTION myf3;
四夜赵、刪除函數(shù)
DROP FUNCTION myf3;
流程控制語句
一明棍、分支結(jié)構(gòu)
1.if函數(shù)
語法:if(條件,值1,值2)
功能:實現(xiàn)雙分支
應(yīng)用在begin end中或外面
2.case結(jié)構(gòu)
語法一:(只能應(yīng)用在begin end 中)
情況1:
case 變量或表達(dá)式
when 值1 then 語句1;
when 值2 then 語句2;
else 語句n;
end case;
情況2:
case
when 條件1 then 語句1;
when 條件2 then 語句2;
else 語句n;
end case;
語法二:(能引用于全部部位的case語法)
情況一:
case 語句
when 值 then 結(jié)果
when 值 then 結(jié)果
else 結(jié)果
end
情況二:
case
when 條件 then 結(jié)果
when 條件 then 結(jié)果
else 結(jié)果
end
3.if結(jié)構(gòu)
語法:
if 條件1 then 語句1;
elseif 條件2 then 語句2;
....
else 語句n;
end if;
功能:類似于多重if
只能應(yīng)用在begin end 中
if案例:創(chuàng)建函數(shù)寇僧,實現(xiàn)傳入成績摊腋,如果成績>90,返回A,如果成績>80,返回B嘁傀,如果成績>60,返回C兴蒸,否則返回D
CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
IF score>90 THEN SET ch='A';
ELSEIF score>80 THEN SET ch='B';
ELSEIF score>60 THEN SET ch='C';
ELSET ch='D';
END IF;
RETURN ch;
END $
SELECT test_if(87)$
case案例:創(chuàng)建函數(shù),實現(xiàn)傳入成績细办,如果成績>90,返回A橙凳,如果成績>80,返回B,如果成績>60,返回C,否則返回D
CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
CASE
WHEN score>90 THEN SET ch='A';
WHEN score>80 THEN SET ch='B';
WHEN score>60 THEN SET ch='C';
ELSE SET ch='D';
END CASE;
RETURN ch;
END $
SELECT test_case(56)$
二岛啸、循環(huán)結(jié)構(gòu)
分類:
while钓觉、loop、repeat
循環(huán)控制:
iterate + 標(biāo)簽:類似于 continue坚踩,繼續(xù)荡灾,結(jié)束本次循環(huán),繼續(xù)下一次
leave + 標(biāo)簽:類似于 break瞬铸,跳出批幌,結(jié)束當(dāng)前所在的循環(huán)
1.while
語法:
標(biāo)簽: while 循環(huán)條件 do
循環(huán)體;
end while 標(biāo)簽;
2.loop
語法:
標(biāo)簽: loop
循環(huán)體;
end loop 標(biāo)簽;
可以用來模擬簡單的死循環(huán)
3.repeat
語法:
標(biāo)簽: repeat
循環(huán)體;
until 結(jié)束循環(huán)的條件
end repeat 標(biāo)簽;
1.沒有添加循環(huán)控制語句
案例:批量插入,根據(jù)次數(shù)插入到admin表中多條記錄
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,password
) VALUES(CONCAT('Rose',i),'666');
SET i=i+1;
END WHILE;
END $
2.添加leave語句
案例:批量插入赴捞,根據(jù)次數(shù)插入到admin表中多條記錄逼裆,如果次數(shù)>20則停止
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,password
) VALUES(CONCAT('xiaohua',i),'0000');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
3.添加iterate語句
案例:批量插入,根據(jù)次數(shù)插入到admin表中多條記錄赦政,只插入偶數(shù)次
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,password
) VALUES(CONCAT('xiaohua',i),'0000');
END WHILE a;
END $
案例
已知表stringcontent
其中字段:
id 自增長
content varchar(20)
向該表插入指定個數(shù)的胜宇,隨機(jī)的字符串
CREATE TABLE stringcontent(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(20)
);
DELIMITER $
CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE startIndex INT; #代表初始索引
DECLARE len INT; #代表截取的字符長度
WHILE i<=insertcount DO
SET startIndex=FLOOR(RAND()*26+1); #代表初始索引,隨機(jī)范圍1-26
SET len=FLOOR(RAND()*(IF(27 - startIndex >= 20,20,27-startIndex))+1); #代表截取長度恢着,隨機(jī)范圍1-(20-startIndex+1)
INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
SET i=i+1;
END WHILE;
END $
————————————————————————————————————————————
JDBC
概念:Java DataBase Connectivity Java 數(shù)據(jù)庫連接桐愉, Java語言操作數(shù)據(jù)庫
JDBC本質(zhì):其實是官方(sun公司)定義的一套操作所有關(guān)系型數(shù)據(jù)庫的規(guī)則,即接口掰派。各個數(shù)據(jù)庫廠商去實現(xiàn)這套接口从诲,提供數(shù)據(jù)庫驅(qū)動jar包。我們可以使用這套接口(JDBC)編程靡羡,真正執(zhí)行的代碼是驅(qū)動jar包中的實現(xiàn)類系洛。
1. 導(dǎo)入驅(qū)動jar包 mysql-connector-java-5.1.37-bin.jar,復(fù)制mysql-connector-java-5.1.37-bin.jar到項目的libs目錄下略步。
2.右鍵-->Add As Library
2. 注冊驅(qū)動
3. 獲取數(shù)據(jù)庫連接對象 Connection
4. 定義sql
5. 獲取執(zhí)行sql語句的對象 Statement
6. 執(zhí)行sql描扯,接受返回結(jié)果
7. 處理結(jié)果
8. 釋放資源
代碼實現(xiàn):
導(dǎo)入驅(qū)動jar包
2.注冊驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
3.獲取數(shù)據(jù)庫連接對象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
4.定義sql語句
String sql = "update account set balance = 500 where id = 1";
5.獲取執(zhí)行sql的對象 Statement
Statement stmt = conn.createStatement();
6.執(zhí)行sql
情況一: 修改表內(nèi)容
int count = stmt.executeUpdate(sql);
情況二: 提取表內(nèi)容
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){
String lname = rs.getString(3);
int id = rs.getInt(1);
System.out.println(lname + "===" + id);
}
rs.next():指針向下移,之后返回當(dāng)前位置是否為空趟薄。非空返回true,空返回false绽诚。
rs.getXxx(int i 或者String str):當(dāng)參數(shù)為int型則返回指針?biāo)谛?i 列的數(shù)據(jù);
當(dāng)參數(shù)為String型則返回指針?biāo)谛辛忻麨閟tr的數(shù)據(jù)杭煎。
7.處理結(jié)果
System.out.println(count);
8.釋放資源 (完整寫法需要 if (恩够?!=null)和try catch異常)
stmt.close();
conn.close();
注意: 當(dāng)有其他參數(shù)影響第四步定義的SQL語句時需要使用 PreparedStatement 類 PreparedStatement 類為 Statement的子類羡铲。
其中方法 setXxx(?索引,值):用于設(shè)置?的值.
4.定義sql語句
String sql = "update account set balance = ? where id = ?";
5.獲取執(zhí)行sql的對象 Statement
Statement stmt = conn.PreparedStatement(sql) ;
stmt.setInt(1,int) ; (設(shè)置問號的值)
stmt.setInt(2,int);
6.執(zhí)行sql
情況一: 修改表內(nèi)容
int count = stmt.executeUpdate();
情況二: 提取表內(nèi)容
ResultSet rs = stmt.executeQuery();
JdbcUtil工具類寫法
①造一個Properties文件用于儲存基本數(shù)據(jù)
②完成方法
private static String driver;
private static String url;
private static String user;
private static String password;
連接方法
public static Connection conn() throws SQLException {
InputStream ras = null;
try {
Properties pro = new Properties();
Class<JdbcUtil> ju = JdbcUtil.class;
ClassLoader cl = ju.getClassLoader();
ras = cl.getResourceAsStream("JDBC.Properties");
pro.load(ras);
driver = pro.getProperty("driver");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(ras!=null) {
try {
ras.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return DriverManager.getConnection(url,user,password);
}
關(guān)閉數(shù)據(jù)方法
public static void closeIO(Statement stmt,Connection conn){
if (stmt !=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
關(guān)閉數(shù)據(jù)方法
public static void closeIO(ResultSet rs, Statement stmt, Connection conn){
if (stmt !=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs !=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
其中 JdbcUtil.conn() 方法 代替了以下內(nèi)容
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
JdbcUtilIO()方法代替了關(guān)閉數(shù)據(jù)的寫法蜂桶。
——————————————————————————————————
JDBC事務(wù)管理
為了防止多條jdbc語句在java運行中出現(xiàn)異常時使用。
connection.setAutoCommit(false); 開啟事務(wù)
connection.commit();提交事務(wù)
connection.rollback();回滾事務(wù)
try {
conn = JdbcUtil.conn();
conn.setAutoCommit(false); //開啟事務(wù)
String sql = "update employees set salary = salary + ? where employee_id ='190' ";
String sql2 = "update employees set salary = salary - ? where employee_id ='200' ";
pstmt = conn.prepareStatement(sql);
pstmt2 = conn.prepareStatement(sql2);
pstmt.setInt(1,500);
pstmt2.setInt(1,500);
pstmt.executeUpdate();
pstmt2.executeUpdate();
conn.commit(); //提交事務(wù)
} catch (SQLException e) {
if (conn != null){
try {
conn.rollback(); //回滾事務(wù)
} catch (SQLException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
} finally {
JdbcUtil.closeIO(pstmt,conn);
JdbcUtil.closeIO(pstmt2,null);
}
————————————————————————————————————————————
數(shù)據(jù)庫連接池
概念:
其實就是一個容器(集合)也切,存放數(shù)據(jù)庫連接的容器屎飘。當(dāng)系統(tǒng)初始化好后妥曲,容器被創(chuàng)建,容器中會申請一些連接對象钦购,當(dāng)用戶來訪問數(shù)據(jù)庫時,從容器中獲取連接對象褂萧,用戶訪問完之后押桃,會將連接對象歸還給容器。
C3P0數(shù)據(jù)庫連接池技術(shù)
步驟:
1. 導(dǎo)入jar包 (兩個) c3p0-0.9.5.2.jar 與 mchange-commons-java-0.2.12.jar 导犹,
不要忘記導(dǎo)入數(shù)據(jù)庫驅(qū)動jar包
2. 定義配置文件:
名稱: c3p0.properties 或者 c3p0-config.xml
路徑:直接將文件放在src目錄下即可唱凯。
3. 創(chuàng)建核心對象 數(shù)據(jù)庫連接池對象 new ComboPooledDataSource
4. 獲取連接: getConnection();
代碼:
1.創(chuàng)建數(shù)據(jù)庫連接池對象
DataSource ds = new ComboPooledDataSource();
2. 獲取連接對象
Connection conn = ds.getConnection();
注: ComboPooledDataSource有兩個構(gòu)造器
默認(rèn)構(gòu)造器返回默認(rèn)配置的DataSource對象
構(gòu)造器二需要傳入String型參數(shù)(為制定配置的名字),返回指定配置的DataSource對象谎痢。
Druid數(shù)據(jù)庫連接池實現(xiàn)技術(shù)磕昼,由阿里巴巴提供的
步驟:
1. 導(dǎo)入jar包 druid-1.0.9.jar 與 properties 文件
2. 定義配置文件:
是properties形式的
可以叫任意名稱,可以放在任意目錄下
3. 加載配置文件节猿。Properties
4. 獲取數(shù)據(jù)庫連接池對象:通過工廠來來獲取 DruidDataSourceFactory
5. 獲取連接:getConnection
代碼:
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
4.獲取連接池對象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
5.獲取連接
Connection conn = ds.getConnection();
注意:以上線程池方法生成的Connectionl鏈接的Close()方法不再是純粹的清除緩存票从,而是將鏈接歸還線程池
定義一個類DRUIDUtils
需要方法
1. 獲取連接方法:通過數(shù)據(jù)庫連接池獲取連接 getConn()
2. 釋放資源 close()
3. 獲取連接池的方法 getDataSource()
private static DataSource ds;
static {
try {
Properties pt = new Properties();
pt.load(DRUIDUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
ds = DruidDataSourceFactory.createDataSource(pt);
} catch (Exception e) {
e.printStackTrace();
}
}
獲取連接方法
public static Connection getConn() throws SQLException {
return ds.getConnection();
}
獲取連接池的方法
public static DataSource getDataSource(){
return ds;
}
釋放資源
public static void close(Statement stmt, Connection conn){
if (stmt !=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs, Statement stmt, Connection conn){
if (stmt !=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs !=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Spring JDBC
Spring框架對JDBC的簡單封裝。提供了一個JDBCTemplate對象簡化JDBC的開發(fā)
步驟:
1. 導(dǎo)入5個 jar 包 JdbcTemplate > lib
2. 創(chuàng)建JdbcTemplate對象滨嘱。依賴于數(shù)據(jù)源DataSource
JdbcTemplate template = new JdbcTemplate(ds);
3. 調(diào)用JdbcTemplate的方法來完成CRUD的操作
①update():執(zhí)行DML語句峰鄙。增、刪太雨、改語句
②queryForMap():
查詢結(jié)果將結(jié)果集封裝為map集合吟榴,將列名作為key,將值作為value 將這條記錄 封裝為一個map集合
注意:這個方法查詢的結(jié)果集長度只能是1
③queryForList():查詢結(jié)果將結(jié)果集封裝為list集合
注意:將每一條記錄封裝為一個Map集合囊扳,再將Map集合裝載到List集合中
④query(): 查詢結(jié)果吩翻,將結(jié)果封裝為JavaBean對象形式放入list集合中
query的參數(shù):RowMapper
一般我們使用BeanPropertyRowMapper實現(xiàn)類∽断蹋可以完成數(shù)據(jù)到JavaBean的自動封裝
new BeanPropertyRowMapper<類型>(類型.class)
⑤queryForObject(sql , 返回類型.class):查詢結(jié)果狭瞎,將結(jié)果封裝為對象(一般用于聚合函數(shù)的查詢)