《瘋狂Java講義》學習筆記(十)資料庫與JDBC程式設計
阿新 • • 發佈:2019-01-30
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();