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();