2018-05-29數(shù)據(jù)庫基礎(chǔ)

Mysql


sql分類:

DDL:

對象:數(shù)據(jù)庫和表

關(guān)鍵詞:create 、alter 晦嵌、drop 同辣、truncate

創(chuàng)建數(shù)據(jù)庫:create database xp;

刪除數(shù)據(jù)庫: drop database xp;

創(chuàng)建表:create table user(

id int primark key? auto_increment,

username varchar(20)

);

修改表:

alter table user rename to user1;

alter table user add password varchar(20);

alter table user change password pwd varchar(20);

alter table user modify pwd int;

alter table user drop pwd;

刪除表:

drop table user;

常用的命令:

use day06;

show tables;

desc user;

show create table user;

DML(數(shù)據(jù)操作語言):

對象:記錄()

關(guān)鍵詞:insert update delete

插入:

insert into user values(字段值1,字段值2,...);-- 所有的字段

insert into user(字段1,字段2....) values(字段值1,字段值2);-- 插入指定的字段

更新:

update user set 字段=字段值1,字段2=字段值2 where 條件;

刪除:

delete from user where 條件;

擴展:

以后開發(fā)中很少使用delete,數(shù)據(jù)無價,刪除有物理和邏輯(常用),

邏輯刪除一般會在表中添加一個字段(isdel:若值為1,代表刪除了;若為0代表沒有刪除),

此時的刪除操作變成了更新操作.

DQL:

select ... from 表名 where 條件 group by 分組字段 having 條件 order by 排序字段;

執(zhí)行順序:

1.確定數(shù)據(jù)來自那張表? from

2.是否需要篩選? where

3.是否需要分組 group by

4.分組后是否需要篩選 having

5.是否需要排序 order by

6.確定顯示那些數(shù)據(jù). select

DCL:用戶 權(quán)限 事務(wù)☆

auto_increment 自增

truncate 干掉表,重新創(chuàng)建 和delete的區(qū)別

數(shù)據(jù)類型:

int 和 varchar(size):可變長度

date time? datetime timestamp


多表的操作:

表與表之間的關(guān)系:

一對多:

在多表的一方添加一個外鍵,外鍵的名稱一般是主表名稱_id,外鍵的類型和主表的主鍵的類型保持一致

為了保證數(shù)據(jù)的有效性和完整性,

需要在多表上添加外鍵約束

格式:

alter table 多表 add [constraint [外鍵的名稱]] foreign key(外鍵名稱) references 主表名稱(主鍵);

多對多:

添加一張中間表,存放兩張表的主鍵,就可以將多對多拆分成兩個一對多了

為了保證數(shù)據(jù)的有效性和完整性,

需要在中間表添加兩個外鍵約束

一對一:(了解)

1.兩個實體合二為一(字段比較少)

2.將一張表的主鍵添加外鍵約束即可

多表的查詢:

內(nèi)連接:

顯式:

select a.*,b.* from a join b on 條件;

隱式:

select a.*,b.* from a,b where 條件;

外連接:

左外連接:

select a.*,b.* from a left join b on 條件;

以a為主,展示所有數(shù)據(jù),根據(jù)條件關(guān)聯(lián)查詢b表,滿足條件則展示,不滿足的話以null顯示

子查詢:

一個查詢依賴于另一個查詢.

案例1-通過jdbc完成單表的curd操作:

需求:

對分類表完成操作.

技術(shù)分析:

jdbc


jdbc:

java操作數(shù)據(jù)庫.jdbc是oracle公司指定的一套規(guī)范(一套接口)

驅(qū)動:jdbc的實現(xiàn)類.由數(shù)據(jù)庫廠商提供.

我們就可以通過一套規(guī)范操作不同的數(shù)據(jù)庫了(多態(tài))

jdbc作用:

連接數(shù)據(jù)庫

發(fā)送sql語句

處理結(jié)果

jdbc操作步驟:★

1.數(shù)據(jù)庫和表

2.創(chuàng)建一個項目

3.導(dǎo)入驅(qū)動jar包

4.編碼:

注冊驅(qū)動

獲取連接

編寫sql

創(chuàng)建預(yù)編譯的語句執(zhí)行者

設(shè)置參數(shù)

執(zhí)行sql

處理結(jié)果

釋放資源

初始化數(shù)據(jù)庫和表:

CREATE DATABASE xp;

USE xp;

create table category(

cid varchar(20) primary key,

cname varchar(20)

);

insert into category values('c001','電器');

insert into category values('c002','服飾');

insert into category values('c003','化妝品');

insert into category values('c004','書籍');

IDE打開之后

1.修改字符集 utf-8

2.新建 java項目

3.使用的jdk為自己的jdk 不用使用內(nèi)置

使用junit單元測試

要求:

1.方法是public void xxx(){}

2.在方法上添加 @Test

3.在@Test 按下 ctrl+1(快速鎖定錯誤)

4.在方法上右鍵 run as? -->junit 就可以執(zhí)行方法了.

jdbc-api詳解:

所有的包 都是 java.sql 或者 javax.sql

DriverManager:管理了一組jdbc的操作 類

常用方法:

了解:注冊驅(qū)動

static void registerDriver(Driver driver) :

通過查看 com.mysql.jdbc.Driver的源碼 有如下代碼

static {

try {

java.sql.DriverManager.registerDriver(new Driver());//這段代碼我們已經(jīng)寫過

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

驅(qū)動注冊了兩次.我們只需要將靜態(tài)代碼塊執(zhí)行一次,類被加載到內(nèi)存中會執(zhí)行靜態(tài)代碼塊,并且只執(zhí)行一次.

現(xiàn)在只需要將類加載到內(nèi)存中即可:

方式1:

★Class.forName("全限定名");//包名+類名? com.mysql.jdbc.Driver

方式2:

類名.class;

方式3:

對象.getClass();

掌握:獲取連接

static Connection getConnection(String url, String user, String password)

參數(shù)1:告訴我們連接什么類型的數(shù)據(jù)庫及連接那個數(shù)據(jù)庫

協(xié)議:數(shù)據(jù)庫類型:子協(xié)議 參數(shù)

mysql: jdbc:mysql://localhost:3306/數(shù)據(jù)庫名稱

oracle: jdbc:oracle:thin@localhost:1521@實例

參數(shù)2:賬戶名 root

參數(shù)3:密碼

(了解)Driver:java.sql 接口 驅(qū)動

Connection:連接 接口

常用方法:

獲取語句執(zhí)行者:

(了解)Statement createStatement() :獲取普通的語句執(zhí)行者? 會出現(xiàn)sql注入問題

★PreparedStatement prepareStatement(String sql) :獲取預(yù)編譯語句執(zhí)行者

(了解)CallableStatement prepareCall(String sql):獲取調(diào)用存儲過程的語句執(zhí)行者

了解:

setAutoCommit(false) :手動開啟事務(wù)

commit():提交事務(wù)

rollback():事務(wù)回滾

Statement:語句執(zhí)行者 接口

PreparedStatement:預(yù)編譯語句執(zhí)行者 接口

常用方法:

設(shè)置參數(shù):

setXxx(int 第幾個問號,Object 實際參數(shù));

常見的方法:

setInt

setString

setObject

執(zhí)行sql:

ResultSet executeQuery() :執(zhí)行 r 語句 返回值:結(jié)果集

int executeUpdate() :執(zhí)行cud 語句 返回值:影響的行數(shù)

ResultSet:結(jié)果集 接口

執(zhí)行查詢語句之后返回的結(jié)果

常用方法:

boolean next():判斷是否有下一條記錄,若有返回true且將光標移到下一行,若沒有呢則返回false

光標一開始處于第一條記錄的上面

獲取具體內(nèi)容

getXxx(int|string)

若參數(shù)為int :第幾列

若參數(shù)為string:列名(字段名)

例如:

獲取cname的內(nèi)容可以通過

getString(2)

getString("cname")

常用方法:

getInt

getString 也可以獲取int值

getObject 可以獲取任意


常見的配置文件格式:

1.properties

里面內(nèi)容的格式 key=value

2.xml

若我們的配置文件為properties,并且放在src目錄下.

我們可以通過 ResourceBundle工具快速獲取里面的配置信息

使用步驟:

1.獲取ResourceBundle 對象:

static ResourceBundle getBundle("文件名稱不帶后綴名")

2.通過ResourceBundle 對象獲取配置信息

String getString(String key) :通過執(zhí)行key獲取指定的value


案例2-通過連接池(數(shù)據(jù)源)優(yōu)化我們的操作.

需求:

使用jdbc的時候,沒操作一次都需要獲取連接(創(chuàng)建)用完之后把連接釋放掉了(銷毀),通過連接池來優(yōu)化curd操作.

技術(shù)分析:

連接池


連接池概述:

管理數(shù)據(jù)庫的連接,

作用:

提高項目的性能.

就是在連接池初始化的時候存入一定數(shù)量的連接,用的時候通過方法獲取,不用的時候歸還連接即可.

所有的連接池必須實現(xiàn)一個接口 javax.sql.DataSource接口

獲取連接方法:

Connection getConnection()

歸還連接的方法就是以前的釋放資源的方法.調(diào)用connection.close();

自定義一個連接池(理解思想)

常用連接池:

DBCP

C3P0


增前方法

1.繼承

2.裝飾者模式(靜態(tài)代理)

3.動態(tài)代理


裝飾者模式:★★★

使用步驟:

1.裝飾者和被裝飾者實現(xiàn)同一個接口或者繼承同一個類

2.裝飾者中要有被裝飾者的引用

3.對需要增強的方法進行加強

4.對不需要加強的方法調(diào)用原來方法


常用的連接池:

DBCP:(理解)

apache組織

使用步驟:

1.導(dǎo)入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)

2.使用api

a.硬編碼

//創(chuàng)建連接池

BasicDataSource ds = new BasicDataSource();

//配置信息

ds.setDriverClassName("com.mysql.jdbc.Driver");

ds.setUrl("jdbc:mysql:///xp");

ds.setUsername("root");

ds.setPassword("1234");

b.配置文件

實現(xiàn)編寫一個properties文件

//存放配置文件

Properties prop = new Properties();

prop.load(new FileInputStream("src/dbcp.properties"));

//設(shè)置

//prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");

//創(chuàng)建連接池

DataSource ds = new BasicDataSourceFactory().createDataSource(prop);

C3P0:(★)

hibernate和spring使用

有自動回收空閑連接的功能.

使用步驟:

1.導(dǎo)入jar包(c3p0-0.9.1.2.jar)

2.使用api

a.硬編碼(不推薦)

new ComboPooledDataSource()

b.配置文件

配置文件的名稱:c3p0.properties 或者 c3p0-config.xml

配置文件的路徑:src下

編碼只需要一句話

new ComboPooledDataSource()//使用默認的配置

new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默認的配置


案例3-使用dbutils完成curd操作

技術(shù)分析:

dbutils

dbutils:

是apache組織的一個工具類,jdbc的框架,更方便我們使用

使用步驟:

1.導(dǎo)入jar包(commons-dbutils-1.4.jar)

2.創(chuàng)建一個queryrunner類

queryrunner作用:操作sql語句

構(gòu)造方法:

new QueryRunner(Datasource ds);

3.編寫sql

4.執(zhí)行sql

query(..):執(zhí)行r操作

update(...):執(zhí)行cud操作


核心類或接口

QueryRunner:類名

作用:操作sql語句

構(gòu)造器:

new QueryRunner(Datasource ds);

注意:

底層幫我們創(chuàng)建連接,創(chuàng)建語句執(zhí)行者 ,釋放資源.

常用方法:

query(..):

update(..):

DbUtils:釋放資源,控制事務(wù) 類

closeQuietly(conn):內(nèi)部處理了異常

commitAndClose(Connection conn):提交事務(wù)并釋放連接

....

ResultSetHandler:封裝結(jié)果集 接口

ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler

(了解)ArrayHandler, 將查詢結(jié)果的第一條記錄封裝成數(shù)組,返回

(了解)ArrayListHandler, 將查詢結(jié)果的每一條記錄封裝成數(shù)組,將每一個數(shù)組放入list中返回

★★BeanHandler, 將查詢結(jié)果的第一條記錄封裝成指定的bean對象,返回

★★BeanListHandler, 將查詢結(jié)果的每一條記錄封裝成指定的bean對象,將每一個bean對象放入list中 返回.

(了解)ColumnListHandler, 將查詢結(jié)果的指定一列放入list中返回

(了解)MapHandler, 將查詢結(jié)果的第一條記錄封裝成map,字段名作為key,值為value 返回

★MapListHandler, 將查詢結(jié)果的每一條記錄封裝map集合,將每一個map集合放入list中返回

★ScalarHandler,針對于聚合函數(shù) 例如:count(*) 返回的是一個Long值


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末券腔,一起剝皮案震驚了整個濱河市纷纫,隨后出現(xiàn)的幾起案子辱魁,更是在濱河造成了極大的恐慌诗鸭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锻弓,死亡現(xiàn)場離奇詭異弥咪,居然都是意外死亡,警方通過查閱死者的電腦和手機聚至,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門扳躬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人击胜,你說我怎么就攤上這事役纹。” “怎么了辰斋?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵宫仗,是天一觀的道長旁仿。 經(jīng)常有香客問我,道長毅贮,這世上最難降的妖魔是什么尘奏? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任罪既,我火速辦了婚禮琢感,結(jié)果婚禮上探熔,老公的妹妹穿的比我還像新娘。我一直安慰自己柬甥,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布卤橄。 她就那樣靜靜地躺著窟扑,像睡著了一般漏健。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殖属,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天瓦盛,我揣著相機與錄音,去河邊找鬼墙懂。 笑死扮念,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的巧勤。 我是一名探鬼主播颅悉,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼迁匠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了延曙?” 一聲冷哼從身側(cè)響起亡哄,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚊惯,失蹤者是張志新(化名)和其女友劉穎灵临,沒想到半個月后儒溉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赊舶,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡笼平,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年寓调,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌涕。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡余黎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惧财,到底是詐尸還是另有隱情扭仁,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布搀突,位于F島的核電站仰迁,受9級特大地震影響顽分,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一悬秉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧和泌,春花似錦、人聲如沸武氓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽属提。三九已至美尸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恕酸,已是汗流浹背胯陋。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寿弱,地道東北人按灶。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓鸯旁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铺罢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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