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值