JDBC概述
?什么是JDBC
JDBC(Java DataBase Connectivity)
稱為Java數(shù)據(jù)庫連接斥赋,它是一種用于數(shù)據(jù)庫訪問的應(yīng)用程序API,由一組用Java語言編寫的類和接口組成,有了JDBC就可以用同一的語法對(duì)多種關(guān)系數(shù)據(jù)庫進(jìn)行訪問夺颤,而不用擔(dān)心其數(shù)據(jù)庫操作語言的差異镣奋。
?JDBC的結(jié)構(gòu)可劃分為兩層:
JDBC Driver Interface(驅(qū)動(dòng)程序管理器接口)
JDBC API
?JDBC優(yōu)缺點(diǎn)
–優(yōu)點(diǎn):
?JDBC使得編程人員從復(fù)雜的驅(qū)動(dòng)器調(diào)用命令和函數(shù)中解脫出來后豫,可以致力于應(yīng)用程序中的關(guān)鍵地方悉尾。
?JDBC支持不同的關(guān)系數(shù)據(jù)庫,這使得程序的可移植性大大加強(qiáng)挫酿。
?JDBC API是面向?qū)ο蟮墓姑校梢宰層脩舭殉S玫姆椒ǚ庋b為—個(gè)類,以備后用
–缺點(diǎn):
?使用JDBC早龟,訪問數(shù)據(jù)記錄的速度會(huì)受到一定程度的影響惫霸。
?JDBC結(jié)構(gòu)中包含不同廠家的產(chǎn)品,這就給更改數(shù)據(jù)源帶來了很大的麻煩葱弟。
?JDBC核心接口與類
?JDBC核心類庫包含在java.sql包中壹店。
–類
?DriverManager:負(fù)責(zé)管理JDBC驅(qū)動(dòng)程序。使用JDBC驅(qū)動(dòng)程序之前芝加,必須先將驅(qū)動(dòng)程序加載并注冊(cè)后才可以使用硅卢,同時(shí)提供方法來建立與數(shù)據(jù)庫的連接。
?SQLException-有關(guān)數(shù)據(jù)庫操作的異常
–接口:
?Connection:特定數(shù)據(jù)庫的連接(會(huì)話)藏杖。在連接上下文中執(zhí)行SQL語句并返回結(jié)果将塑。
?PreparedStatement:表示預(yù)編譯的 SQL 語句的對(duì)象。
?Statement:用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果的對(duì)象蝌麸。
?ResultSet :表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表点寥,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成 。
?CallableStatement :用于執(zhí)行 SQL 存儲(chǔ)過程的接口 来吩。
創(chuàng)建JDBC應(yīng)用
?創(chuàng)建JDBC應(yīng)用程序的步驟
–1.載入JDBC驅(qū)動(dòng)程序
–2.定義連接URL
–3.建立連接
–4.創(chuàng)建Statement對(duì)象
–5.執(zhí)行查詢或更新
–6.結(jié)果處理
–7.關(guān)閉連接
?數(shù)據(jù)庫驅(qū)動(dòng)程序
–數(shù)據(jù)庫驅(qū)動(dòng)程序分類
?Type 1: jdbc-odbc橋
–把JDBC API調(diào)用轉(zhuǎn)換成ODBC API 調(diào)用, 然后ODBC API調(diào)用針對(duì)供應(yīng)商的ODBC 驅(qū)動(dòng)程序來訪問數(shù)據(jù)庫, 即利用JDBC- ODBC 橋通過ODBC來存儲(chǔ)數(shù)據(jù)源 敢辩。
?Type 2: 本地API驅(qū)動(dòng)
–本地api驅(qū)動(dòng)直接把jdbc調(diào)用轉(zhuǎn)變?yōu)閿?shù)據(jù)庫的標(biāo)準(zhǔn)調(diào)用再去訪問數(shù)據(jù)庫. 這種方法需要本地?cái)?shù)據(jù)庫驅(qū)動(dòng)代碼。訊误褪。
?Type 3: 網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)
–它使用一種與具體數(shù)據(jù)庫無關(guān)的協(xié)議將數(shù)據(jù)庫請(qǐng)求發(fā)送給一個(gè)中間服務(wù)器责鳍。
?Type 4: 本地協(xié)議驅(qū)動(dòng)
– 這種驅(qū)動(dòng)直接把jdbc調(diào)用轉(zhuǎn)換為符合相關(guān)數(shù)據(jù)庫系統(tǒng)規(guī)范的請(qǐng)求.由于4型驅(qū)動(dòng)寫的應(yīng)用可以直接和數(shù)據(jù)庫服務(wù)器通訊,這種類型的驅(qū)動(dòng)完全由java實(shí)現(xiàn)兽间,因此實(shí)現(xiàn)了平臺(tái)獨(dú)立性。
?通常開發(fā)中多采用第四種方式正塌,這種驅(qū)動(dòng)不需要先把jdbc的調(diào)用傳給odbc或本地?cái)?shù)據(jù)庫接口或者是中間層服務(wù)器嘀略,所以它的執(zhí)行效率是非常高的驅(qū)動(dòng)
?數(shù)據(jù)庫驅(qū)動(dòng)程序
–各數(shù)據(jù)庫廠商均提供對(duì) JDBC 的支持,即提供數(shù)據(jù)庫連接使用的驅(qū)動(dòng)程序文件
–需要為數(shù)據(jù)庫應(yīng)用程序正確加載驅(qū)動(dòng)程序文件以獲得數(shù)據(jù)庫連接乓诽,實(shí)施操作
–Oracle 數(shù)據(jù)庫的 JDBC 驅(qū)動(dòng)程序文件 “ojdbc14.jar”(Oracle官方網(wǎng)站下載)
?加載 JDBC 驅(qū)動(dòng)程序
–Class 類中提供加載驅(qū)動(dòng)程序的方法:
className-表示類的描述符的字符串
–Oracle 驅(qū)動(dòng)的類描述符為:
public static Class forName(String className) throws ClassNotFoundException
oracle.jdbc.driver.OracleDriver
–示例:
–在工程主類 JdbcOracleTest 的 main 方法中增加加載 Oracle 驅(qū)動(dòng)的代碼:
?聲明表示 Oracle 驅(qū)動(dòng)類描述符的字符串變量 driver
?調(diào)用 Class 類的靜態(tài)方法 forName 加載該驅(qū)動(dòng)(注意異常處理)
?建立與數(shù)據(jù)庫的連接
–DriverManager 類提供 getConnection 方法可獲得指定數(shù)據(jù)庫的連接對(duì)象:
–Oracle 數(shù)據(jù)庫的 url 格式為:
public static Connection getConnection (String url, String userName, String password) throws SQLException
jdbc:oracle:thin:@<主機(jī)名或IP>:1521:<數(shù)據(jù)庫名>
–示例
–修改類 JdbcOracleTest 的 main 方法:
?聲明表示指定數(shù)據(jù)庫url的字符串變量 url
?分別聲明表示用戶名和口令的字符串變量 userName 和 password帜羊,分別初始化為 "SCOTT" 和 "TIGER“
?聲明Connection接口對(duì)象con,賦值為 DriverManager類的getConnection方法的返回值
?輸出打印 “數(shù)據(jù)庫連接成功” 的提示信息
?獲得 Statement 對(duì)象
–Connection接口中提供可獲得 Statement 對(duì)象的方法:
–可調(diào)用重載的 createStatement 方法鸠天,可指定參數(shù)讼育,設(shè)置數(shù)據(jù)庫操作結(jié)果的相關(guān)屬性。
?執(zhí)行 SQL 語句
–Statement接口提供可執(zhí)行 SQL 命令的方法:
boolean execute(String sql) throws SQLException
ResultSet executeQuery(String sql) throws SQLException
int executeUpdate(String sql) throws SQLException
–示例(查詢)
–在工程主類 JdbcOracleTest 的 main 方法中增加操作數(shù)據(jù)庫的代碼:
?獲得可發(fā)送SQL命令的Statement對(duì)象st
?調(diào)用對(duì)象st的excuteQuery方法發(fā)送SQL查詢命令,查詢SCOTT下的表DEPT奶段,獲得所有記錄數(shù)據(jù)饥瓷,返回結(jié)果集對(duì)象rs
?操作結(jié)果集對(duì)象
–ResultSet接口提供可對(duì)結(jié)果集進(jìn)行操作的方法:
?移動(dòng)結(jié)果集操作指針:
?指定數(shù)據(jù)類型根據(jù)傳入列的名字獲取指定列的值:
?指定數(shù)據(jù)類型根據(jù)傳入列的編號(hào)獲取指定列的值:
boolean next() throws SQLException
Xxx getXxx(String columnName) throws SQLException
Xxx getXxx(1) throws SQLException
?關(guān)閉操作對(duì)象及連接
?可調(diào)用接口ResultSet、Statement痹籍、Connection 中的關(guān)閉方法呢铆,立即釋放數(shù)據(jù)庫和 JDBC 相關(guān)資源:
void close() throws SQLException
–示例
–在工程主類 JdbcOracleTest 的 main 方法中增加關(guān)閉數(shù)據(jù)庫操作對(duì)象的代碼:
?關(guān)閉結(jié)果集對(duì)象 rs
?關(guān)閉 Statement 對(duì)象 st
?關(guān)閉 Connection 對(duì)象 con
?JDBC日期時(shí)間處理
?對(duì)于數(shù)據(jù)庫種不同的時(shí)間類型,要分別采用與之相對(duì)應(yīng)的Java包裝類來存取:
–日期類型用java.sql.Date
–時(shí)間類型用java.sql.Time
–日期/時(shí)間類型用java.sql.Timestamp蹲缠;
–getTimestamp()可以把年月日時(shí)分秒都取出來棺克,getDate()只能取出年月日,getTime()只能取出時(shí)分秒线定。
?JDBC的日期/時(shí)間類型轉(zhuǎn)換為字符串
–Timestamp timeStamp = //通過數(shù)據(jù)庫訪問獲取到該數(shù)據(jù)
–SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
–String str = sdf.format(timeStamp);
?java.sql.Timestamp如何轉(zhuǎn)換為java.util.Date
–java.sql.Timestamp是java.util.Date的子類娜谊,不需要做任何轉(zhuǎn)換直接賦值即可:
–java.sql.Timestamp ts;
–java.util.Date utilDate;
–utilDate = ts;
?java.util.Date如何轉(zhuǎn)換為java.sql.Timestamp
–java.util.Date是java.sql.Timestamp的父類,要這樣轉(zhuǎn)換:
–java.sql.Timestamp ts;
–java.util.Date utilDate;
–ts.setTime(utilDate.getTime());
?PreparedStatement接口
–PreparedStatement接口是Statement接口的子接口斤讥,允許使用不同的參數(shù)多次執(zhí)行同樣的 SQL 語句因俐。
–Connection接口提供創(chuàng)建PreparedStatement對(duì)象的方法,可指定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接口優(yōu)點(diǎn):
–可動(dòng)態(tài)設(shè)置參數(shù)
–增加了預(yù)編譯功能
–提高執(zhí)行速度