Mysql數(shù)據(jù)庫

<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 '__%' ESCAPE '';

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ù)的查詢)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市她君,隨后出現(xiàn)的幾起案子脚作,更是在濱河造成了極大的恐慌,老刑警劉巖缔刹,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件球涛,死亡現(xiàn)場離奇詭異,居然都是意外死亡校镐,警方通過查閱死者的電腦和手機(jī)亿扁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸟廓,“玉大人从祝,你說我怎么就攤上這事襟己。” “怎么了牍陌?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵擎浴,是天一觀的道長。 經(jīng)常有香客問我毒涧,道長贮预,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任契讲,我火速辦了婚禮仿吞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捡偏。我一直安慰自己唤冈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布银伟。 她就那樣靜靜地躺著你虹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枣申。 梳的紋絲不亂的頭發(fā)上售葡,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音忠藤,去河邊找鬼挟伙。 笑死,一個胖子當(dāng)著我的面吹牛模孩,可吹牛的內(nèi)容都是我干的尖阔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼榨咐,長吁一口氣:“原來是場噩夢啊……” “哼介却!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起块茁,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤齿坷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后数焊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體永淌,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年佩耳,在試婚紗的時候發(fā)現(xiàn)自己被綠了遂蛀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡干厚,死狀恐怖李滴,靈堂內(nèi)的尸體忽然破棺而出螃宙,到底是詐尸還是另有隱情,我是刑警寧澤所坯,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布谆扎,位于F島的核電站,受9級特大地震影響芹助,放射性物質(zhì)發(fā)生泄漏燕酷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一周瞎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饵蒂,春花似錦声诸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渊迁,卻和暖如春慰照,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琉朽。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工毒租, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箱叁。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓墅垮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耕漱。 傳聞我的和親對象是個殘疾皇子算色,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容