1. 程式人生 > >Java ——JDBC數據庫編程

Java ——JDBC數據庫編程

磁盤文件 計算 luci span ger 內容變化 local databases tco

數據庫分類

  • 關系型數據庫:以表來存放數據的,數據與數據之間的關系通過表之間的連接體現
  • 面向對象的數據庫:保存的是對象本身
  • 其它

數據庫:數據庫管理系統中創建一個個的保存數據的單位

數據是保存在數據庫的表中的

存儲引擎

MyISAM

存儲引擎:不支持事務、也不支持外鍵,優勢是訪問速度快,對事務完整性沒有 要求或者以select,insert為主的應用基本上可以用這個引擎來創建表

支持3種不同的存儲格式,分別是:靜態表;動態表;壓縮表

靜態表:表中的字段都是非變長字段,這樣每個記錄都是固定長度的,優點存儲非常迅速,容易緩存,出現故障容易恢復;缺點是占用的空間通常比動態表多(因為存儲時會按照列的寬度定義補足空格)

ps:在取數據的時候,默認會把字段後面的空格去掉,如果不註意會把數據本身帶的空格也會忽略。

動態表:記錄不是固定長度的,這樣存儲的優點是占用的空間相對較少;缺點:頻繁的更新、刪除數據容易產生碎片,需要定期執行OPTIMIZE TABLE或者myisamchk-r命令來改善性能

壓縮表:因為每個記錄是被單獨壓縮的,所以只有非常小的訪問開支

InnoDB

該存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM引擎,寫的處理效率會差一些,並且會占用更多的磁盤空間以保留數據和索引。

InnoDB存儲引擎的特點:支持自動增長列,支持外鍵約束

MEMORY

Memory存儲引擎使用存在於內存中的內容來創建表。每個memory表只實際對應一個磁盤文件,格式是.frm。memory類型的表訪問非常的快,因為它的數據是放在內存中的,並且默認使用HASH索引,但是一旦服務關閉,表中的數據就會丟失掉。

MEMORY存儲引擎的表可以選擇使用BTREE索引或者HASH索引,兩種不同類型的索引有其不同的使用範圍

Hash索引優點:

Hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高於 B-Tree 索引。

Hash索引缺點: 那麽不精確查找呢,也很明顯,因為hash算法是基於等值計算的,所以對於“like”等範圍查找hash索引無效,不支持;

Memory類型的存儲引擎主要用於哪些內容變化不頻繁的代碼表,或者作為統計操作的中間結果表,便於高效地對中間結果進行分析並得到最終的統計結果,。對存儲引擎為memory的表進行更新操作要謹慎,因為數據並沒有實際寫入到磁盤中,所以一定要對下次重新啟動服務後如何獲得這些修改後的數據有所考慮。

MERGE

Merge存儲引擎是一組MyISAM表的組合,這些MyISAM表必須結構完全相同,merge表本身並沒有數據,對merge類型的表可以進行查詢,更新,刪除操作,這些操作實際上是對內部的MyISAM表進行的。

事務

做一件事情的最小單元,要麽同時成功,要麽同時失敗。

InoDB才支持事務

數據類型

數字型

類型

大小

範圍(有符號)

範圍(無符號)

用途

TINYINT

1 字節

(-128127)

(0255)

小整數值

SMALLINT

2 字節

(-32 76832 767)

(065 535)

大整數值

MEDIUMINT

3 字節

(-8 388 6088 388 607)

(016 777 215)

大整數值

INTINTEGER

4 字節

(-2 147 483 6482 147 483 647)

(04 294 967 295)

大整數值

BIGINT

8 字節

(-9 233 372 036 854 775 8089 223 372 036 854 775 807)

(018 446 744 073 709 551 615)

極大整數值

FLOAT

4 字節

(-3.402 823 466 E+381.175 494 351 E-38)0(1.175 494 351 E-383.402 823 466 351 E+38)

0(1.175 494 351 E-383.402 823 466 E+38)

單精度
浮點數值

DOUBLE

8 字節

(1.797 693 134 862 315 7 E+3082.225 073 858 507 201 4 E-308)0(2.225 073 858 507 201 4 E-3081.797 693 134 862 315 7 E+308)

0(2.225 073 858 507 201 4 E-3081.797 693 134 862 315 7 E+308)

雙精度
浮點數值

DECIMAL

DECIMAL(M,D) ,如果M>D,為M+2否則為D+2

依賴於MD的值

依賴於MD的值

小數值

字符類型

CHAR

0-255字節

定長字符串

VARCHAR

0-255字節

變長字符串

TINYBLOB

0-255字節

不超過 255 個字符的二進制字符串

TINYTEXT

0-255字節

短文本字符串

BLOB

0-65 535字節

二進制形式的長文本數據

TEXT

0-65 535字節

長文本數據

MEDIUMBLOB

0-16 777 215字節

二進制形式的中等長度文本數據

MEDIUMTEXT

0-16 777 215字節

中等長度文本數據

LOGNGBLOB

0-4 294 967 295字節

二進制形式的極大文本數據

LONGTEXT

0-4 294 967 295字節

極大文本數據

時間類型

類型

大小
(字節)

範圍

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

‘-838:59:59‘/‘838:59:59‘

HH:MM:SS

時間值或持續時間

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

1000-01-01 00:00:00/9999-12-31 23:59:59

YYYY-MM-DD HH:MM:SS

混合日期和時間值

TIMESTAMP

8

1970-01-01 00:00:00/2037 年某時

YYYYMMDD HHMMSS

混合日期和時間值,時間戳

JDBC主要完成的幾個任務

1.與數據庫建立連接

2.發送SQL語句

3.處理數據庫返回的結果

基礎SQL操作

查看數據庫管理系統中有哪些數據庫:show databases;

使用某一個數據庫:use mysql;

查看數據庫有多少表:show tables;

查看表中的數據:select * from user;

查看表的結構:desc user;

創建表:

create table <表名>(
  字段名 字段類型 ,
字段名 字段類型 ,
   ……
字段名 字段類型 
);

創建數據庫:

Create databases 數據庫名;

主鍵——記錄的唯一標識

只有數據類型(int)的主鍵列才能自動增加

示例:

CREATE TABLE `tb_dept` (
  `deptno` int(2) NOT NULL AUTO_INCREMENT,
  `dname` varchar(8) NOT NULL,
  `loc` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

外鍵

表與表之間的關鏈

技術分享圖片

外鍵字段所引用的字段必須是另一個表的主鍵

技術分享圖片示例:

CREATE TABLE `tb_emp` (
  `EMPNO` int(4) NOT NULL AUTO_INCREMENT,
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` int(4) DEFAULT NULL,
  `HIREDATE` date DEFAULT NULL,
  `SAL` int(7) DEFAULT NULL,
  `COMM` int(7) DEFAULT NULL,
  `DEPTNO` int(2) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`),
  KEY `DEPTNO` (`DEPTNO`),
  CONSTRAINT `tb_emp_ibfk_1` FOREIGN KEY (`DEPTNO`) REFERENCES `tb_dept` (`deptno`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

create/insert

Insert into 表名 (字段列表) values(值列表);

示例:

insert into tb_dept (deptno,dname,loc) values(123,"123","123");

insert into tb_dept (deptno,dname,loc) values(null,"123","123");

insert into tb_dept (dname,loc) values("123","123");

update

Update 表名

set 字段1= 值1,字段1= 值1,

where 條件

示例:

update tb_dept set dname= "abcd" ;

update tb_dept set dname= "abcd" where deptno = 125;

update tb_dept set dname= "abcd",loc="abcd" where deptno = 125;

update tb_dept set dname= "***"where deptno >40;

-- and && or ||

update tb_dept set dname= "1234" where deptno >40 and loc = "123";

update tb_dept set dname= "1111" where deptno >124 or loc = "123";

delete

Delete from 表名 where 條件;

示例:

delete from tb_dept where deptno = 125;

select

SELECT 字段列表 from 表名 where 條件;

示例:

簡單查詢

select deptno ,dname,loc from tb_dept;

select * from tb_dept;

select dname,loc from tb_dept;

select * from tb_dept where loc != "123";

模糊查詢

查詢部門中包含a的所有的記錄

select * from tb_dept where loc like ‘%a%‘;

查詢倒數第2個字母是a的部門的名稱

select * from tb_dept where loc like ‘%a_‘;

關聯查詢

查詢SCOTT所在的部門的名稱

select dname from tb_dept where deptno =(select deptno from tb_emp where ename=‘SCOTT‘);

select tb_dept.dname

from tb_emp ,tb_dept

where tb_emp.ename=‘SCOTT‘ and tb_emp.deptno = tb_dept.deptno;

select tb_dept.dname

from tb_emp inner join tb_dept

on tb_emp.deptno= tb_dept.deptno

where tb_emp.ename= ‘scott‘;

1.查找

SELECT [ALL | DISTINCT] [INTO 新數據表名]
FROM [表名|視圖名]
〔WHERE 條件〕
GROUP BY 把查到的按什麽標準分組
〔HAVING 指定分組搜索條件〕
〔ORDER BY 按什麽順序排序〕 〔升序|降序〕

解釋:

  all指明查詢結果中可以顯示值相同的列【默認】

  distinct指如有值相同的列,只顯示一個【NULL被認為是相同的值】

註意:SELECT...INTO...不能與COMPUTE子句一起使用

2.數據插入

INSERT INTO 表名 列名 VALUE 〔對應列的值〕

3.數據修改

UPDATE 表名 SET 列名=表達式 〔WHERE 條件〕

4.數據刪除

DELETE FROM 表名|視圖名 〔WHERE 條件〕

完整示例:

package com.runoob.test;
 
import java.sql.*;
 
public class MySQLDemo {
 
    // JDBC 驅動名及數據庫 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
 
    // 數據庫的用戶名與密碼,需要根據自己的設置
    static final String USER = "root";
    static final String PASS = "123456";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            // 註冊 JDBC 驅動
            Class.forName("com.mysql.jdbc.Driver");
        
            // 打開鏈接
            System.out.println("連接數據庫...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 執行查詢
            System.out.println(" 實例化Statement對象...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, name, url FROM websites";
            ResultSet rs = stmt.executeQuery(sql);
        
            // 展開結果集數據庫
            while(rs.next()){
                // 通過字段檢索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("url");
    
                // 輸出數據
                System.out.print("ID: " + id);
                System.out.print(", 站點名稱: " + name);
                System.out.print(", 站點 URL: " + url);
                System.out.print("\n");
            }
            // 完成後關閉
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 處理 JDBC 錯誤
            se.printStackTrace();
        }catch(Exception e){
            // 處理 Class.forName 錯誤
            e.printStackTrace();
        }finally{
            // 關閉資源
            try{
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
            }// 什麽都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}

詳細攻略

Java ——JDBC數據庫編程