JavaWeb之MySql與JDBC

JDBC(JAVA DataBase connectivity)-java數(shù)據(jù)庫連接

為什么會出現(xiàn)JDBC

  • SUN公司提供的一種數(shù)據(jù)庫訪問規(guī)則、規(guī)范,由于數(shù)據(jù)庫種類較多,并且java語言使用比較廣泛,sun公司就提供了一種規(guī)范,讓其它的數(shù)據(jù)庫提供商去實現(xiàn)底層的訪問。java程序只要使用java提供的JDBC驅(qū)動就能訪問數(shù)據(jù)庫

    JAVA連接數(shù)據(jù)庫的基本步驟(JDBC使用基本步驟)

    //1.注冊驅(qū)動
    DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    //2.建立連接
    //DriverManager.getConnection("jdbc:mysql://localhost/studnet?user=monty&password=greatsqldb");
    java.sql.Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");
    //3.創(chuàng)建Statement對象,和數(shù)據(jù)庫打交道需要此對象
    Statement st = connection.createStatement();
    //4.執(zhí)行sql,得到結(jié)果
    String sql="select * from t_stu";
    ResultSet rs = st.executeQuery(sql);
    //5.查詢到的數(shù)據(jù)庫數(shù)據(jù)進行遍歷輸出
    while(rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");
    int age = rs.getInt("age");
    System.out.println("id="+id+"name="+name+"age="+age);
    }
    //關(guān)閉數(shù)據(jù)庫操作對象
    rs.close();
    st.close();
    conn.close();
    
    
    • JDBC通過配置文件連接數(shù)據(jù)庫

      //屬性配置文件jdbc.properties
      driverClass=com.mysql.jdbc.Driver
      url=jdbc:mysql://localhost/student
      name=root
      password=root
      //創(chuàng)建一個配置屬性對象
      Properties properties=new Properties();
      //InputStream is=new FileInputStream("jdbc.properties");
      //使用類加載器獲取src下的資源文件
      InputStream is=MainTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
      //導(dǎo)入輸入流
      properties.load(is);
      //讀取屬性
      String driverClass=properties.getProperty("driverClass");
      String name=properties.getProperty("name");
      String url=properties.getProperty("url");
      String password=properties.getProperty("password");
      Class.forName(driverClass);
      java.sql.Connection connection = DriverManager.getConnection(url, name, password);
      
      
    • 預(yù)處理sql語句,propertiesStatement

MYSQL

  • MYSQL免安裝版配置

    • 下載MYSQL解壓

    • 在MYSQL安裝目錄根目錄下新建my.ini文件

      [mysql]  
      # 設(shè)置mysql客戶端默認(rèn)字符集  
      default-character-set=utf8  
      [mysqld]  
      #設(shè)置3306端口  
      port = 3306  
      # 設(shè)置mysql的安裝目錄  
      basedir=E:\BriskTools\mysql-5.7.24-winx64
      # 設(shè)置mysql數(shù)據(jù)庫的數(shù)據(jù)的存放目錄  
      datadir=E:\BriskTools\mysql-5.7.24-winx64\data
      # 允許最大連接數(shù)  
      max_connections=200  
      # 服務(wù)端使用的字符集默認(rèn)為8比特編碼的latin1字符集  
      character-set-server=utf8  
      # 創(chuàng)建新表時將使用的默認(rèn)存儲引擎  
      default-storage-engine=INNODB  
      
      
    • 配置環(huán)境變量,cmd安裝mysql服務(wù),登錄mysql

  • 數(shù)據(jù)庫概述

    • 數(shù)據(jù)庫就是一個文件系統(tǒng),只不過我們需要通過命令來操作這個文件系統(tǒng)
    • 數(shù)據(jù)庫是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的建立在計算機存儲設(shè)備上的倉庫
    • 數(shù)據(jù)庫是長期存儲在計算機內(nèi)、有組織的、可共享的數(shù)據(jù)集合.數(shù)據(jù)庫中的數(shù)據(jù)指的是以一定的數(shù)據(jù)模型組織、描述和存儲在一起、具有盡可能小的冗余度、較高的數(shù)據(jù)獨立性和易擴展的特點并可在一定范圍內(nèi)位多個用戶共享、
  • 數(shù)據(jù)庫的作用

    • 存儲數(shù)據(jù),數(shù)據(jù)的倉庫,帶有訪問權(quán)限限制不同人可以有不同操作
    • 應(yīng)用頁面操作的大多是后臺數(shù)據(jù),從數(shù)據(jù)庫取到后臺數(shù)據(jù)進行封裝,然后交給前端去展現(xiàn)
  • 常見的數(shù)據(jù)庫

    • 關(guān)系型數(shù)據(jù)庫(主要是用來描述實體與實體之間的關(guān)系)

      • mysql:sun公司收購了mysql,sun公司被oracle收購了
      • oracle
      • db2
      • sqlServer:windpws、政府網(wǎng)站多用
    • NOSQL類型的非關(guān)系數(shù)據(jù)庫:mongodb、redis

  • E-R圖實體-聯(lián)系圖

    • 定義:是指提供了表示實體型、屬性和聯(lián)系的方法,用來描述現(xiàn)實世界的概念模型。E-R方法:是“實體-聯(lián)系方法”(Entity-Relationship Approach)的簡稱。它是描述現(xiàn)實世界概念結(jié)構(gòu)模型的有效方法。

    • 基本要素

      • 實體型:方框
      • 屬性:橢圓
      • 聯(lián)系:菱形
  • MYSQL數(shù)據(jù)庫服務(wù)器

    • MYSQL數(shù)據(jù)庫:數(shù)據(jù)庫管理軟件
    • 服務(wù)器:就是一臺電腦,這臺電腦安裝相關(guān)的服務(wù)器軟件,這些軟件會監(jiān)聽不同的端口號,根據(jù)用戶訪問的端口號,提供不同服務(wù)
  • MYSQL的安裝和卸載

    • 卸載

      1. 控制面板卸載mysql
      2. 刪除mysql安裝目錄的所有文件
      3. 刪除mysql數(shù)據(jù)存放文件:c:\ProgramData\MySql
    • 安裝

      • 免安裝版
      • 安裝版
  • MYSQL的SQL語句

    • SQL:結(jié)構(gòu)化查詢語言(Structured Query Language)
    • DDL:數(shù)據(jù)定義語言,定義數(shù)據(jù)庫、數(shù)據(jù)表的結(jié)構(gòu):create、drop(刪除)、alter(修改)
    • DML:數(shù)據(jù)庫操縱語言,主要用來操作數(shù)據(jù):insert()、update、delete
    • DCL:數(shù)據(jù)庫控制語言,定義訪問權(quán)限,取消訪問權(quán)限,安全設(shè)置:grant
    • DQL:數(shù)據(jù)庫查詢語言:select、from、where
  • 數(shù)據(jù)庫的CRUD的操作

    • 數(shù)據(jù)庫登錄:mysql -u root -p

    • 創(chuàng)建數(shù)據(jù)庫:create database day06 | create database day06_1 character set utf8;

    • 表操作

      • 查看表的定義:show create table student.
      • 查看表結(jié)構(gòu):desc student.
      • 添加列:alter table student add 列名 列的類型 列的約束(alter table student add chengji int not null)
      • 修改列:alter table student modify sex varchar(2);
      • 修改列名:alter table student change sex gender varchar(2);
      • 刪除列:ater table student drop chengji;
      • 修改表名:rename table student to xuesheng;
      • 修改表字符集:alter table student character set gbk;
      • 刪除表:drop table student;
      • 數(shù)據(jù)庫約束:primary key(主鍵)、unique(唯一)、not null
    • 表中數(shù)據(jù)操作

      • 插入數(shù)據(jù):insert into student (id,name,sex) values(1,'zhangsan','男');

      • 批量插入:insert into student (1,'lisi','男'),(2,'zhaoliu','男')

      • 查看數(shù)據(jù):select * from student;

      • 刪除數(shù)據(jù):delete from student where id=2;

      • 更新表:update student set name='李四' where id=8;

      • 查詢表:select distinct price from product; (distinct 去重)

        • select ,price1.5 from product;(運算查詢)
        • elect ,price1.5 as 折后價 from product;
        • 查詢可以使用where大于和小于:select * from product where price >10 and price <100;
        • 查詢還可以使用between關(guān)鍵字:select * from product where price between 100 and 10;
        • 查詢邏輯運算符的應(yīng)用:and ,or, not
        • select * from product where pname like '%餅%'
        • select * from product where pname like '_熊%';
        • select * from product where cno in(1,4,5);
        • 查詢所有按價格排序:select * from product order by price;
        • select * from product order by price desc; (asc-升序,desc-降序)
        • sum():求和--select sum(price) from product;
        • avg():求平均值--select avg(price) from product;
        • count():統(tǒng)計數(shù)量--select count(*) from product;
        • select * from product where price >(select avg(price) from product);//條件語句后面不能跟函數(shù)所以這么寫
        • 查詢結(jié)果分組:select cno,count(*) from product group by cno;
        • 分組統(tǒng)計平均值,并且平均值大于60:select cno,avg(price) from product group by cno having avg(price) > 60;
        • sql編寫順序(S..F..W..G..H..O):select .. from .. where .. group by .. having .. order by
        • sql執(zhí)行順序:F .. W .. G .. H .. S .. O
        • max():最大值
        • min():最小值
    truncate和delete 和drop的區(qū)別(面試題)
    • delete是DML,執(zhí)行時從加where會刪除指定行,不加where會逐行全部刪除,可以回滾需要commit

    • truncate是DDL,會隱式提交,不能回滾,沒有日志,執(zhí)行很快,刪除表所有數(shù)據(jù)

    • drop是DDL,會隱式提交,不能回滾,會刪除表結(jié)構(gòu)及所有數(shù)據(jù),并釋放全部空間

    • 總結(jié)

      • 1、在速度上,一般來說,drop> truncate > delete。(數(shù)據(jù)少delete高效,數(shù)據(jù)多truncate高效)

        2、在使用drop和truncate時一定要注意,雖然可以恢復(fù),但為了減少麻煩,還是要慎重。

        3、如果想刪除部分?jǐn)?shù)據(jù)用delete,注意帶上where子句,回滾段要足夠大;

        如果想刪除表,當(dāng)然用drop;

        如果想保留表而將所有數(shù)據(jù)刪除,如果和事務(wù)無關(guān),用truncate即可;

        如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete;

        如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入/插入數(shù)據(jù)。

SQL多表操作

多表之間關(guān)系如何維護

  • 外鍵約束:forerign key

    • alert table product add foreign key(cno) references category(cid);
  • 數(shù)據(jù)庫建表建庫原則

    • 通常一個項目建一個數(shù)據(jù)庫

    • 建表原則

      • 一對多:在多的一方添加一個外鍵指向一的一方的主鍵

      • 多對多:多建一張中間表,將多對多的關(guān)系拆成一對多的關(guān)系,中間表至少要有兩個外鍵,分別對應(yīng)原來的表

      • 一對一(不多用,拆表操作可能用,將個人常用信息和不常有信息拆分,減少表的臃腫)

        • 將一對一情況當(dāng)作是一對多,在任意一張表添加一個外鍵,并且這個外鍵要唯一,指向另一張表
        • 直接將兩張表合并成一張表
        • 將兩張表建立連接,讓兩張表主鍵相等
  • 主鍵約束:默認(rèn)不能為空,必須唯一,外鍵都是指向另外一張表的主鍵,一張表只有一個主鍵

  • 唯一約束:必須唯一,可以為空,唯一約束不可以作為其它表的外鍵,一張表可以有多個唯一約束

多表查詢

  • 交叉連接查詢,笛卡爾積

    • select * from product ,category where cno=cid;
  • 內(nèi)鏈接查詢:查詢出兩張表交集數(shù)據(jù)

    • 隱式內(nèi)連接(在查詢出結(jié)果的基礎(chǔ)上做where條件過濾):select * from product p,category c where p.cno=c.cid;
    • 顯示內(nèi)連接(帶著條件去查詢結(jié)果,執(zhí)行效率高):select * from product p INNER JOIN category c ON p.cno=c.cid;
  • 左外連接:會將左表數(shù)據(jù)都查詢出來,如果右表沒有對應(yīng)的用null代替

    • select * from product p left outer join category c ON p.cno=c.cid;
  • 右外連接:會將右表所有數(shù)據(jù)都查詢出來,左表沒有對應(yīng)數(shù)據(jù)用null代替

    • select * from product p right outer join category c ON p.cno=c.cid;

分頁查詢

  • select * from product limit (頁數(shù)-1)*每頁條數(shù) ,每頁條數(shù)

子查詢

  • select * from product where cno=(select cid from category where cname='手機數(shù)碼');

  • select pname,(select cname from category c where p.cno=c.cid) as 商品分類名稱 from product p;

  • select * from emp where sal=(select max(sal) from emp);

  • 單行子查詢(> < >= <= = <>)

    • 查詢出高于10號部門的平均工資的員工信息
  • 多行子查詢(in not any all)

    • 查詢出比10號部門任何員工薪資高的員工信息
  • 多列子查詢(實際使用較少)

    • 和10號部門同名同工作信息的員工
  • select 接子查詢

    • 獲取員工的名字和部門的名字
  • from后面接子查詢

    • 查詢emp表中的經(jīng)理信息
  • where接子查詢

    • 薪資高于10號部門平均工資的所有員工信息
  • having后面接子查詢

    • 有哪些部門的平均工資高于30號部門的平均工資
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • MYSQL 基礎(chǔ)知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 8,056評論 5 115
  • 觀其大綱 page 01 基礎(chǔ)知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 M...
    周少言閱讀 3,250評論 0 33
  • 最近打算采用關(guān)系型數(shù)據(jù)庫來理一下公司的運營數(shù)據(jù),先拿點東西練手找感覺。下面是幾個關(guān)于學(xué)生課業(yè)的表,需要建立一個數(shù)據(jù)...
    九天朱雀閱讀 1,045評論 0 3
  • 曲曲漸行離地高,浮浮白云遮身腰。嬈嬈青松隨山去,漸漸仙境圍身俏。
    桃李天下秀閱讀 303評論 0 0
  • 今日讀了《色眼識人》中有關(guān)黃色優(yōu)勢的部分,感覺與我的期盼很是吻合,希望自己也能做一個果敢有行動力的人。 附上一些文...
    劉小花Crystal閱讀 311評論 0 0

友情鏈接更多精彩內(nèi)容