一、什么是JDBC
? ?JDBC是Java語言連接數據庫的接口規范。
?
二、JDBC的體系
? 1、Java官方提供一個操作數據庫的抽象接口
? ? 抽象接口有很多的接口和抽象類。
? ?例如:Driver、Connection、Statement。
?
? ?2、各個數據庫廠商提供各自的Java實現類
? ? 需要各自實現具體的細節。
? ? 例如:設計怎么和數據庫服務器通信?如何傳遞SQL語句?如何傳遞執行結果?
?
三、JDBC官方常用接口
? JDBC的接口所在的包是:? java.sql.*
?
?(一)加載驅動實現類
? ? ? ? 主要目的是指定程序當前要和哪一種數據庫通信。
?
? ?1、基礎知識
? ?驅動類的抽象類是:
java.sql.Driver。
? ?MySQL廠商的實現類是:
com.mysql.jdbc.Driver
?
? 2、把含有實現類的jar包放入類路徑
? ? ? ?需要從那些數據庫廠商的官網下載jar文件,放入項目的類路徑下。
? ? ? ? 驅動jar文件名字類似"mysql-connection-java-xxx.jar"。
?
? ?3、加載驅動實現類的方法
? ?第一種:
? ? 調用java.sql.DriverManager類的下列方法
public static void??registerDriver(Driver 驅動對象)
(以MySQL為案例):
// 構建驅動實現類的對象
Driver? temp = new com.mysql.jdbc.Driver();
?
// 注冊到驅動管理器中
DriverManager.registerDriver(temp);
?
?第二種:
? 用類對象的反射加載。
? 調用Class類的下列靜態方法:
public static Class forName("類的包名.類名")
(以MySQL為案例):
// 加載驅動類
Class.forName("com.mysql.jdbc.Driver")
?
?(二)獲得連接對象
? ?Java程序和數據庫通信,需要一個連接對象。
? ?連接對象的類:
java.sql.Connection
? 如何獲得連接對象:
? 1、準備三個信息:
? ?連接的URL地址:描述數據庫在哪臺計算機上。
? ?數據庫賬號名:代表用哪個賬號連接。
? ?賬號的密碼:用密碼來驗證當前程序是不是擁有賬號的所有權。
?
?2、調用DriverManager類的下列方法
public?static Connection getConnection(
? ?String 地址,?
? ?String 賬號,?
? ?String? 密碼
)
? MySQL的案例:
? 假設數據庫路徑是 "jdbc:mysql://127.0.0.1:6666",用戶名是"root",密碼是"123"。
Connection con = DriverManager.getConnection(
? ? ? "jdbc:mysql://127.0.0.1:6666",
? ? ? "root",
? ? ? "123");
?說明:
? ? 數據庫的連接路徑規則是
jdbc:數據庫類型名字:數據庫IP地址或者域名:端口[/默認數據庫]
? ?MySQL數據庫的類型是"mysql"。
? ?后面可以不接默認數據庫。
? ?案例:
// 假設在IP地址是192.168.4.121的計算機上,有一個監聽在3306端口的MySQL服務器,它的連接路徑如下:
?
jdbc:mysql://192.168.4.121:3306
?
?連接對象的其他方法:
// 設置是否開啟自動事務提交
void setAutoCommit(boolean 值)
?
// 設置保存點
Savepoint setSavePoint()
?
// 手動提交事務
void commit()
?
// 回滾事務
void rollback()
?
// 回滾到指定的保存點
void rollback(Savepoint 保存點)
?
? (三)創建語句對象
? ?語句對象是為了執行具體的SQL語句。
? ?1、語句類的路徑:
java.sql.Statement
? 2、如何獲得語句對象:
? 調用Connection類型的對象的下列方法:
public Statement createStatement()
案例:
Statement state = con.createStatement();
?
? 3、主要的方法
? ?1)用于執行一般的SQL語句:
// 執行SQL語句
boolean? execute(String? SQL語句)
? ?返回值:
? ? ? ?true? :? 結果是ResultSet結果集對象。
? ? ? ?false :? 結果是更新的行數,或者沒有結果。
?
? ? 相關方法:
// 如果execute執行返回true,需要下列方法獲取結果集:
ResultSet? getResultSet()
?
// 如果execute執行返回false,需要下列方法獲取更新的記錄行數:
int? getUpdateCount()
?
? 2)用于專門的查詢
? ? ? ?返回一個ResultSet結果集對象,適合select語句。
? 方法如下:
ResultSet? executeQuery(String SQL語句)
? 案例:
// 查詢user數據表的所有記錄
ResultSet? rs =? state.executeQuery("select? *? from user");
?
?3)專門的更新操作
? ? ?返回本次更新的記錄行數,適合insert、update、delete三種語句。
? ? ?方法如下:
int? executeUpdate(String SQL語句)
? 案例:
// 刪除user數據表的id為255的記錄
int count?=? state.executeUpdate("delete? ? from user where id = '255' ");
?
// 打印刪除的記錄行數
System.out.println("本次執行刪除記錄個數:"? + count);
?
?(四)處理結果集
? ? ? ?結果集是把查詢的記錄放到一個列表集合里,從上到下依次獲取。
? ?結果集類:
java.sql.ResultSet
? ?主要方法:
? ?1、跳轉行記錄
? 行號從1開始編號。
// 跳轉到指定的行,成功返回true
boolean? absolute(int? 行號)
?
// 跳轉到第一行,成功返回true
boolean first()
?
// 跳轉到最后一行,成功返回true
boolean last()
?
// 跳轉到前一行,成功返回true
boolean previous()
?
// 跳轉到下一行,成功返回true
boolean next()
?
?2、獲得一行的字段值
? ? ? ?JDBC為每種類型都提供了對應的get方法,方便匹配字段值的類型。
? ?例如: getInt() getFloat() getDouble() getLong() getSring() getTime() getDate()。
?
? 第一種:用字段名獲取
? ?以獲取String類型為例:
String? getString(String? 字段名)
? 獲取字段名是id的值:
String value = rs.getString("id");
?
?第二種:用字段值所在的列號獲取
? 列是從1開始編號。
? 1代表第一列,2代表第二列。
?以獲取String類型為例:
String? getString(int 列號)
?獲取第2列的值:
String value = rs.getString(2);
?
3、實際的處理邏輯
// 獲取結果集對象
ResultSet rs = state.executeUpdate("SQL語句");
?
// 循環處理,有下一行就繼續循環
while(rs.next()){
? ? // 用get方法獲得當前行的字段
}
?
// 關閉結果集
rs.close();
?
四、注意事項
? 1、連接用完后及時調用close()方法關閉。
? 2、結果集獲取字段值的方法要和返回的類型匹配。
? 3、賬號權限設計合理,不能獲取最高權限。
?