《瘋狂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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章