MySQL多表
外鍵
主表主鍵和從表外鍵 ==(從表的外鍵引用主表的主鍵)==
從表的外鍵類型必須和主表的主鍵類型一樣
主鍵被外鍵引用的時候不能刪(主表不能刪除已經(jīng)被從表引用的記錄)
從表外鍵不能添加主表不存在的記錄
外鍵作用
-- 分類表
create table category(
cid varchar(32) primary key,
cname varchar(100)
);
-- 商品表
create table product(
pid varchar(32) primary key,
pname varchar(40),
price double,
category_id varchar(32)
);
-- 添加外鍵
alter table 從表 add [constraint] [外鍵名] foreign key (從表外鍵字段名) references 主表 (主表主鍵);
alter table product add foreign key(category_id) references category(cid);
alter table product add constraint product_fk foreign key(category_id) references category(cid);
表與表之間關(guān)系
一對多關(guān)系
主表主鍵被多個從表的外鍵引用
部門--員工,分類--商品,客戶--訂單
多對多關(guān)系
多對多關(guān)系需要創(chuàng)建第三者表,表中至少2個字段,這2個字段分別作為外鍵指向各自一方的主鍵
學(xué)生--課程
一對一關(guān)系(了解)
開發(fā)中不常用,可以做成一張表
主表的主鍵唯一,主表的外鍵也唯一unique
創(chuàng)建表實(shí)現(xiàn)
代碼實(shí)現(xiàn)多對多的關(guān)系
product 和 訂單表
--多對多
-- 訂單表
CREATE TABLE orders(
oid VARCHAR(32) PRIMARY KEY,
totalprice DOUBLE
);
-- 訂單項(xiàng)表
CREATE TABLE orderitem(
oid VARCHAR(50),
pid VARCHAR(50)
);
-- 商品表
create table product(
pid varchar(32) primary key,
pname varchar(40),
price double,
category_id varchar(32)
);
-- 聯(lián)合主鍵(可省略)
alter table orderitem add primary key(oid,pid);
-- 訂單表和訂單項(xiàng)表的主外鍵關(guān)系
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
-- 商品表和訂單項(xiàng)表的主外鍵關(guān)系
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);
查詢操作
查詢分類
交叉連接查詢(基本不會使用,得到的是兩個表的乘積)
select * from A,B;
A表有n條記錄,B表有m條記錄,得到的結(jié)果為n*m條記錄
內(nèi)連接查詢(使用關(guān)鍵字inner join --inner可以省略)
隱式內(nèi)連接: select * from A,B where 條件;
顯式內(nèi)連接:select * fom A inner join B on 條件;
外連接查詢(使用關(guān)鍵字outer join --outer可以省略)
左外連接:left outer join
右外連接:right outer join
區(qū)別:
左外連接:左表的全部以及兩個表的交集(內(nèi)連接)
右外連接:右表的全部以及兩個表的交集(內(nèi)連接)
-- 隱式內(nèi)鏈接查詢
SELECT * FROM category,product WHERE category_id=cid;
SELECT * FROM category AS c,product AS p WHERE c.cid = p.category_id;
-- 顯示內(nèi)鏈接查詢
SELECT * FROM category INNER JOIN product ON cid = category_id;
SELECT * FROM category AS c INNER JOIN product AS p ON c.cid = p.category_id;
-- 左右外連接查詢
SELECT * FROM category LEFT OUTER JOIN product ON cid = category_id;
SELECT * FROM category AS c LEFT OUTER JOIN product AS p ON c.cid = p.category_id;
SELECT * FROM category RIGHT OUTER JOIN product ON cid = category_id;
SELECT * FROM category AS c RIGHT OUTER JOIN product AS p ON c.cid = p.category_id;
子查詢
將一條select語句結(jié)果作為另一條select語法的一部分(查詢條件,查詢結(jié)果,表等)
根據(jù)category表的"化妝品"字段搜索到它的cid,然后根據(jù)cid去product表里搜索所有的化妝品產(chǎn)品
開發(fā)中子查詢用的概率沒有內(nèi)連接和外連接用的多
JDBC
抽取工具類
在數(shù)據(jù)庫連接中,加載驅(qū)動,獲取連接,釋放資源的代碼都是重復(fù)的,如果對數(shù)據(jù)庫操作的方法多,就會使代碼冗余量多
public class JDBCUtils {
private static Connection conn = null;
static {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mybase";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("加載數(shù)據(jù)庫驅(qū)動失敗!");
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("連接數(shù)據(jù)庫異常");
}
}
private JDBCUtils(){}
public static Connection getConnection() {
return conn;
}
}
使用properties配置文件
在開發(fā)中遇到的四個參數(shù):驅(qū)動類型,數(shù)據(jù)庫url,用戶名,密碼通常寫在配置文件中,方便后期的維護(hù)和更新數(shù)據(jù)庫
如果不使用配置文件,通過硬編碼的形式獲取數(shù)據(jù)庫連接,交付工程后客戶如果需要修改數(shù)據(jù)庫類型或者修改數(shù)據(jù)庫信息,則需要重新給一份bin/class文件
通過配置文件,就不需要動代碼了
位置: src文件下
如果是web程序,則放在classpath文件夾下
文件按擴(kuò)展名必須是properties
文件內(nèi)容:
一行一組數(shù)據(jù): key=value
不要有空格
不支持中文,只能使用英文
db.properties文件內(nèi)容:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbname
user=root
password=root
通過ResourceBundle加載配置文件
ResourceBundle專門用于處理properties文件的
讀取的文件名不需要加后綴
ResourceBundle rb = ResourceBundle.getBundle("fileName");//不需要加后綴
String value = rb.getString("key");
通過Properties加載配置文件
Properties類也用于處理properties文件的
讀取的文件名需要加后綴
//獲取類加載器
static {
InputStream is = currentClass.class.getClassLoader().getRescoreAsStream("fileName.propertyes");
Properties prop = new Propertyes();
prop.load(is);
String value = prop.getProperties("key");
}
最后編輯于 :2017.12.08 00:40:57
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。 平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。