JDBC概述
?什么是JDBC
JDBC(Java DataBase Connectivity)
稱為Java數據庫連接,它是一種用于數據庫訪問的應用程序API,由一組用Java語言編寫的類和接口組成,有了JDBC就可以用同一的語法對多種關系數據庫進行訪問,而不用擔心其數據庫操作語言的差異。
?JDBC的結構可劃分為兩層:
JDBC Driver Interface(驅動程序管理器接口)
JDBC API
?JDBC優缺點
–優點:
?JDBC使得編程人員從復雜的驅動器調用命令和函數中解脫出來,可以致力于應用程序中的關鍵地方。
?JDBC支持不同的關系數據庫,這使得程序的可移植性大大加強。
?JDBC API是面向對象的,可以讓用戶把常用的方法封裝為—個類,以備后用
–缺點:
?使用JDBC,訪問數據記錄的速度會受到一定程度的影響。
?JDBC結構中包含不同廠家的產品,這就給更改數據源帶來了很大的麻煩。
?JDBC核心接口與類
?JDBC核心類庫包含在java.sql包中。
–類
?DriverManager:負責管理JDBC驅動程序。使用JDBC驅動程序之前,必須先將驅動程序加載并注冊后才可以使用,同時提供方法來建立與數據庫的連接。
?SQLException-有關數據庫操作的異常
–接口:
?Connection:特定數據庫的連接(會話)。在連接上下文中執行SQL語句并返回結果。
?PreparedStatement:表示預編譯的 SQL 語句的對象。
?Statement:用于執行靜態 SQL 語句并返回它所生成結果的對象。
?ResultSet :表示數據庫結果集的數據表,通常通過執行查詢數據庫的語句生成 。
?CallableStatement :用于執行 SQL 存儲過程的接口 。
創建JDBC應用
?創建JDBC應用程序的步驟
–1.載入JDBC驅動程序
–2.定義連接URL
–3.建立連接
–4.創建Statement對象
–5.執行查詢或更新
–6.結果處理
–7.關閉連接
?數據庫驅動程序
–數據庫驅動程序分類
?Type 1: jdbc-odbc橋
–把JDBC API調用轉換成ODBC API 調用, 然后ODBC API調用針對供應商的ODBC 驅動程序來訪問數據庫, 即利用JDBC- ODBC 橋通過ODBC來存儲數據源 。
?Type 2: 本地API驅動
–本地api驅動直接把jdbc調用轉變為數據庫的標準調用再去訪問數據庫. 這種方法需要本地數據庫驅動代碼。訊。
?Type 3: 網絡協議驅動
–它使用一種與具體數據庫無關的協議將數據庫請求發送給一個中間服務器。
?Type 4: 本地協議驅動
– 這種驅動直接把jdbc調用轉換為符合相關數據庫系統規范的請求.由于4型驅動寫的應用可以直接和數據庫服務器通訊,這種類型的驅動完全由java實現,因此實現了平臺獨立性。
?通常開發中多采用第四種方式,這種驅動不需要先把jdbc的調用傳給odbc或本地數據庫接口或者是中間層服務器,所以它的執行效率是非常高的驅動
?數據庫驅動程序
–各數據庫廠商均提供對 JDBC 的支持,即提供數據庫連接使用的驅動程序文件
–需要為數據庫應用程序正確加載驅動程序文件以獲得數據庫連接,實施操作
–Oracle 數據庫的 JDBC 驅動程序文件 “ojdbc14.jar”(Oracle官方網站下載)
?加載 JDBC 驅動程序
–Class 類中提供加載驅動程序的方法:
className-表示類的描述符的字符串
–Oracle 驅動的類描述符為:
public static Class forName(String className) throws ClassNotFoundException
oracle.jdbc.driver.OracleDriver
–示例:
–在工程主類 JdbcOracleTest 的 main 方法中增加加載 Oracle 驅動的代碼:
?聲明表示 Oracle 驅動類描述符的字符串變量 driver
?調用 Class 類的靜態方法 forName 加載該驅動(注意異常處理)
?建立與數據庫的連接
–DriverManager 類提供 getConnection 方法可獲得指定數據庫的連接對象:
–Oracle 數據庫的 url 格式為:
public static Connection getConnection (String url, String userName, String password) throws SQLException
jdbc:oracle:thin:@<主機名或IP>:1521:<數據庫名>
–示例
–修改類 JdbcOracleTest 的 main 方法:
?聲明表示指定數據庫url的字符串變量 url
?分別聲明表示用戶名和口令的字符串變量 userName 和 password,分別初始化為 "SCOTT" 和 "TIGER“
?聲明Connection接口對象con,賦值為 DriverManager類的getConnection方法的返回值
?輸出打印 “數據庫連接成功” 的提示信息
?獲得 Statement 對象
–Connection接口中提供可獲得 Statement 對象的方法:
–可調用重載的 createStatement 方法,可指定參數,設置數據庫操作結果的相關屬性。
?執行 SQL 語句
–Statement接口提供可執行 SQL 命令的方法:
boolean execute(String sql) throws SQLException
ResultSet executeQuery(String sql) throws SQLException
int executeUpdate(String sql) throws SQLException
–示例(查詢)
–在工程主類 JdbcOracleTest 的 main 方法中增加操作數據庫的代碼:
?獲得可發送SQL命令的Statement對象st
?調用對象st的excuteQuery方法發送SQL查詢命令,查詢SCOTT下的表DEPT,獲得所有記錄數據,返回結果集對象rs
?操作結果集對象
–ResultSet接口提供可對結果集進行操作的方法:
?移動結果集操作指針:
?指定數據類型根據傳入列的名字獲取指定列的值:
?指定數據類型根據傳入列的編號獲取指定列的值:
boolean next() throws SQLException
Xxx getXxx(String columnName) throws SQLException
Xxx getXxx(1) throws SQLException
?關閉操作對象及連接
?可調用接口ResultSet、Statement、Connection 中的關閉方法,立即釋放數據庫和 JDBC 相關資源:
void close() throws SQLException
–示例
–在工程主類 JdbcOracleTest 的 main 方法中增加關閉數據庫操作對象的代碼:
?關閉結果集對象 rs
?關閉 Statement 對象 st
?關閉 Connection 對象 con
?JDBC日期時間處理
?對于數據庫種不同的時間類型,要分別采用與之相對應的Java包裝類來存取:
–日期類型用java.sql.Date
–時間類型用java.sql.Time
–日期/時間類型用java.sql.Timestamp;
–getTimestamp()可以把年月日時分秒都取出來,getDate()只能取出年月日,getTime()只能取出時分秒。
?JDBC的日期/時間類型轉換為字符串
–Timestamp timeStamp = //通過數據庫訪問獲取到該數據
–SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
–String str = sdf.format(timeStamp);
?java.sql.Timestamp如何轉換為java.util.Date
–java.sql.Timestamp是java.util.Date的子類,不需要做任何轉換直接賦值即可:
–java.sql.Timestamp ts;
–java.util.Date utilDate;
–utilDate = ts;
?java.util.Date如何轉換為java.sql.Timestamp
–java.util.Date是java.sql.Timestamp的父類,要這樣轉換:
–java.sql.Timestamp ts;
–java.util.Date utilDate;
–ts.setTime(utilDate.getTime());
?PreparedStatement接口
–PreparedStatement接口是Statement接口的子接口,允許使用不同的參數多次執行同樣的 SQL 語句。
–Connection接口提供創建PreparedStatement對象的方法,可指定SQL語句:
PreparedStatement prepareStatement(String sql) throws SQLException
PreparedStatement pstmt = con.prepareStatement ("INSERT INTO EMP VALUES(?,?)"); pstmt.setInt(1, 99); pstmt.setString(2, "Tom"); int count = pstmt.executeUpdate( );
?PreparedStatement接口優點:
–可動態設置參數
–增加了預編譯功能
–提高執行速度