1. 程式人生 > >《瘋狂Java講義》學習筆記(十)資料庫與JDBC程式設計

《瘋狂Java講義》學習筆記(十)資料庫與JDBC程式設計

1、JDBC基礎

  • JDBC的全程是Java Database Connectivity,即Java資料庫連線,它是一種可以執行SQL語句的Java API;JDBC為資料庫開發提供了標準的API,所以使用JDBC開發的資料庫應用可以跨平臺執行,而且可以跨資料
  • JDBC可以完成三個基本工作:
    建立與資料庫的連線
    執行SQL語句
    獲得SQL語句的執行結果
  • JDBC驅動的4中型別:
    ->JDBC-ODBC橋,這種驅動將JDBC API對映到ODBC API,已經在Java8中被刪除
    ->直接將JDBC API對映成資料庫特定的客戶端API,這種驅動包含了特定資料庫的原生代碼,用於訪問特定資料庫客戶端
    ->支援三層結構的JDBC訪問方式,主要用於Applet階段,通過Applet訪問資料庫
    ->純Java的,直接與資料庫例項互動,它知道資料庫使用的底層協議,也是目前推薦的JDBC驅動

2、Sql語句

  • 資料庫型別
    網狀型資料庫
    層次性資料庫
    關係資料庫
    面向物件資料庫
  • 關係資料庫是理論最成熟、應用最廣泛的資料庫,它最基本的資料儲存單元就是資料表,可以簡單把資料庫想象成大量資料表的集合
  • 面向物件資料庫則是由面向物件程式語言催生的新型資料庫,但面向物件資料庫還沒有大規模地商業應用

3、Sql語句的幾種型別:

DML(Data Manipulation Language,資料操作語言):主要由insert、update和delete三個關鍵字完成
DDL(Data Definition Language,資料定義語言):主要由create、alter、drop和truncate四個關鍵字完成
DCL(Data Control Language,資料控制語言):主要由grant和revoke兩個關鍵字完成
事務控制語句:主要由commit、rollback和savepoint三個關鍵字完成

4、識別符號在Sql中的使用

識別符號可以用於定義表名、列名,也可以用於定義變數等
識別符號通常必須以字母開頭
識別符號包括字母、數字和三個特殊字元(#_$)
不要使用當前資料庫的關鍵字、保留字,通常建議使用多個單詞連綴而成,單詞之間使用_分隔
同一個模式下的物件不應該同名,同一個庫中的不同表或同一張表中的不同欄位

5、資料庫約束

  • 所有的關係資料庫都支援對資料表使用約束,通過約束可以更好地保證資料表裡資料的完成行:
    NOT NULL:非空約束,指定某列不能為空
    UNIQUE:唯一約束,指定某列或者幾列組合不能重複
    PRIMARY KEY:主鍵,指定該列的值可以唯一地標識該條記錄
    CHECK:檢查,指定一個布林表示式,用於指定對應列的值必須滿足該表示式
  • 約束分類
    單列約束:每個約束只約束一列
    多列約束:每個約束可以約束多個數據列
  • 為資料表指定約束的兩個時機:
    建表的同事為相應的資料列指定約束
    建表後建立,以修改表的方式來增加約束

6、索引

  • 索引是存放在模式(schema)中的一個數據庫物件,雖然索引總是從屬於資料庫,但它也和資料表一樣屬於資料庫物件;建立索引的唯一作用就是加速對標的查詢,索引通過使用快速路徑訪問方法來快速定位資料,從而減少磁碟的I/O
  • 建立索引的兩種方式:
    自動:當在表上定義主鍵約束、唯一約束和外來鍵約束時,系統會為該資料列自動建立對應的索引
    手動:使用者可以通過create index…語句來建立索引
  • 刪除索引的兩種方式:
    自動:資料表被刪除時,該表上的索引自動被刪除
    手動:使用者可以通過drop index…語句來刪除指定資料表上的指定索引

7、檢視

  • 檢視看上去非常像一個數據表,但它不是資料表,不能儲存資料;檢視只是一個或多個數據表中資料的邏輯顯示
  • 使用檢視的好處:
    可以限制對資料的訪問
    可以使複雜的查詢變得簡單
    提供了資料的獨立性
    提供了對相同資料的不同顯示

8、JDBC程式設計步驟

  • 載入資料庫驅動
    Class.forName(driveClass);
  • 通過DriverManager獲取資料庫連線
    DriverManager.getConnection(String url,String user,String psw);
  • 通過Connection物件建立Statement物件的方法:
    createStatement():建立基本的Statement物件
    prepareStatement(String sql):根據傳入的Sql語句建立預編譯的Statement物件
    prepareCall(Sring ql):根據傳入的Sql語句建立CallableStatement物件(儲存過程)
  • 使用Statement執行Sql語句
    execute():可以執行任何Sql語句,但比較麻煩
    executeUpdate():主要用於執行DML和DDL語句,執行DML語句返回受Sql語句影響的行數,執行DDL語句返回0
    executeQuery():只能執行查詢語句,執行後返回代表查詢結果的ResultSet物件
  • 操作結果集,如果執行Sql語句是查詢語句,則返回一個ResultSet物件,提供如下方法:
    next()、previous()、first()、last()、beforeFirst()、afterLast()、absolute()等移動記錄指標的方法
    getXxx()方法獲取記錄指標指向行、特定列的值,該方法既可以使用列索引作為引數,也可以使用列名作為引數
  • 回收資料庫資源,包括關閉ResultSet、Statement和Connection等資源

9、ResultSetMetaData分析結果集

ResultSet裡包含一個getMetaData()方法,該方法返回該ResultSet對應的ResultSetMetaData物件:
int getColumnCount():返回該ResultSet的列數量
String getColumnName(int column):返回指定索引的列名
int getColumnType(int column):返回指定索引的列型別

10、事務處理

  • 事務時由一步或幾步資料庫操作序列組成的邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄
  • 事務具備4個特性:
    原子性(Atomicity)
    一致性(Consistency)
    隔離性(Isolation)
    持續性(Durability)
    1#### 1、DBCP資料來源
  • jar
    commons-dbcp.jar
    commons-pool.jar
  • 連線程式碼
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName();
    ds.setUrl();
    ds.setUserName();
    ds.setPassword();
    // 初始連線數
    ds.setInitialSize();
    // 最多有多少個活動連線數
    ds.setMaxAcive();
    // 最小有多小個空閒連線
    ds.setMinIdle();
    Connection conn = ds.getConnection();
    conn.close();
    1#### 2、C3P0資料來源
  • jar
    c3p0-0.9.1.2.jar
  • 連線程式碼
    ComboPooledDataSource ds = new ComboPooledDataSource();
    ds.setDriverClass();
    ds.setJdbcUrl();
    ds.setUser();
    ds.setPassword();
    // 最大連線數
    ds.setMaxPoolSize();
    // 最小連線數
    ds.setMinPoolSize();
    // 初始連線數
    ds.setInitialPoolSize();
    // 連線池的快取Statement的最大數
    ds.setMaxStatements();