09_MySQL多表 & JDBC

MySQL多表
外鍵
  • 主表主鍵和從表外鍵 ==(從表的外鍵引用主表的主鍵)==
  • 從表的外鍵類型必須和主表的主鍵類型一樣
  • 主鍵被外鍵引用的時候不能刪(主表不能刪除已經被從表引用的記錄)
    • 不然從表的數據到主表里查不到
  • 從表外鍵不能添加主表不存在的記錄
  • 外鍵作用
    • 保證數據的完整性
-- 分類表
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);
表與表之間關系
  • 一對多關系
    • 主表主鍵被多個從表的外鍵引用
    • 部門--員工,分類--商品,客戶--訂單
  • 多對多關系
    • 多對多關系需要創建第三者表,表中至少2個字段,這2個字段分別作為外鍵指向各自一方的主鍵
    • 學生--課程
  • 一對一關系(了解)
    • 開發中不常用,可以做成一張表
    • 主表的主鍵唯一,主表的外鍵也唯一unique
創建表實現
  • 代碼實現多對多的關系
  • product 和 訂單表
--多對多
-- 訂單表
CREATE TABLE orders(
    oid VARCHAR(32) PRIMARY KEY,
    totalprice DOUBLE
);

-- 訂單項表
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)
);

-- 聯合主鍵(可省略)
alter table orderitem add primary key(oid,pid);

-- 訂單表和訂單項表的主外鍵關系
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);

-- 商品表和訂單項表的主外鍵關系
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);
查詢操作
  • 查詢分類
    1. 交叉連接查詢(基本不會使用,得到的是兩個表的乘積)
      • select * from A,B;
      • A表有n條記錄,B表有m條記錄,得到的結果為n*m條記錄
    2. 內連接查詢(使用關鍵字inner join --inner可以省略)
      • 隱式內連接: select * from A,B where 條件;
      • 顯式內連接:select * fom A inner join B on 條件;
    3. 外連接查詢(使用關鍵字outer join --outer可以省略)
      • 左外連接:left outer join
      • 右外連接:right outer join
      • 區別:
        • 左外連接:左表的全部以及兩個表的交集(內連接)
        • 右外連接:右表的全部以及兩個表的交集(內連接)
-- 隱式內鏈接查詢
SELECT * FROM category,product WHERE category_id=cid;
SELECT * FROM category AS c,product AS p WHERE c.cid = p.category_id;
-- 顯示內鏈接查詢
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語句結果作為另一條select語法的一部分(查詢條件,查詢結果,表等)
    • 根據category表的"化妝品"字段搜索到它的cid,然后根據cid去product表里搜索所有的化妝品產品
  • 開發中子查詢用的概率沒有內連接和外連接用的多
JDBC
抽取工具類
  • 在數據庫連接中,加載驅動,獲取連接,釋放資源的代碼都是重復的,如果對數據庫操作的方法多,就會使代碼冗余量多
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("加載數據庫驅動失敗!");
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("連接數據庫異常");
        }
    }
    private JDBCUtils(){}
    public static Connection getConnection() {
        return conn;
    }
}
使用properties配置文件
  • 在開發中遇到的四個參數:驅動類型,數據庫url,用戶名,密碼通常寫在配置文件中,方便后期的維護和更新數據庫
  • 如果不使用配置文件,通過硬編碼的形式獲取數據庫連接,交付工程后客戶如果需要修改數據庫類型或者修改數據庫信息,則需要重新給一份bin/class文件
  • 通過配置文件,就不需要動代碼了
  • 位置: src文件下
    • 如果是web程序,則放在classpath文件夾下
  • 文件按擴展名必須是properties
  • 文件內容:
    • 一行一組數據: key=value
    • 不要有空格
    • 不支持中文,只能使用英文
db.properties文件內容:

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");
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容