Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java數(shù)據(jù)庫編程基礎(chǔ)_第1頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java數(shù)據(jù)庫編程基礎(chǔ)_第2頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java數(shù)據(jù)庫編程基礎(chǔ)_第3頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java數(shù)據(jù)庫編程基礎(chǔ)_第4頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java數(shù)據(jù)庫編程基礎(chǔ)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Java數(shù)據(jù)庫編程基礎(chǔ)本講目標(biāo)JDBC概述JDBC常用API(Driver、DriverManager、Connection、Statement、ResultSet)連接數(shù)據(jù)庫的基本過程執(zhí)行查詢語句處理數(shù)據(jù)集應(yīng)用JDBC訪問SQLServer數(shù)據(jù)庫2JDBC概述概述(什么是JDBC)java數(shù)據(jù)庫連接(JavaDatabaseConnectivity,JDBC)是一種用于執(zhí)行SQL語句的JavaAPI,由一組用Java編程語言編寫的類和接口組成。JDBC為數(shù)據(jù)庫開發(fā)人員提供了一組標(biāo)準(zhǔn)的API,使他們能夠用純JavaAPI來編寫數(shù)據(jù)庫應(yīng)用程序。3JDBC概述JDBC的目的? 推廣java的應(yīng)用。 設(shè)計(jì)出一種通用的數(shù)據(jù)庫訪問接口。使應(yīng)用程序開發(fā)人員使用JDBC可以連接任何提供了JDBC驅(qū)動(dòng)程序的數(shù)據(jù)庫系統(tǒng)。JDBC的用途是什么? 簡單地說,JDBC可做三件事: 數(shù)據(jù)庫建立連接。 發(fā)送SQL語句。 處理結(jié)果。

4JDBC概述JDBC工作原理JDBC有兩部分組成,第一部分是供程序員調(diào)用的API,另一部分是需要數(shù)據(jù)庫廠商實(shí)現(xiàn)的SPI(ServlceProviderInterface,數(shù)據(jù)庫廠商需要實(shí)現(xiàn)的接口),也就是驅(qū)動(dòng)程序。java/web應(yīng)用程序JDBCMysqlOracledb2Mysql驅(qū)動(dòng)Oracle驅(qū)動(dòng)db2驅(qū)動(dòng)5JDBC常用API常用的類或者接口作用DriverManager類驅(qū)動(dòng)管理類,支持驅(qū)動(dòng)器和數(shù)據(jù)庫連接的創(chuàng)建Connection接口代表與某一數(shù)據(jù)庫的連接Statement接口在連接中執(zhí)行SQL并取得執(zhí)行結(jié)構(gòu)PreparedStatement接口是Statement的子接口,代表預(yù)編譯的SQL聲明CallableStatement接口是Statement的子接口,代表SQL的存儲(chǔ)過程ResultSet接口代表執(zhí)行SQL后產(chǎn)生的數(shù)據(jù)庫結(jié)果集6JDBC常用APIDriverManager DriverManager類是JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間。它跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫和相應(yīng)驅(qū)動(dòng)程序之間建立連接。 對于簡單的應(yīng)用程序,一般程序員需要在此類中直接使用的唯一方法是DriverManager.getConnection。正如名稱所示,該方法將建立與數(shù)據(jù)庫的連接。JDBC允許用戶調(diào)用DriverManager的方法getDriver、getDrivers和registerDriver及Driver的方法connect。但多數(shù)情況下,讓DriverManager類管理建立連接的細(xì)節(jié)為上策。7JDBC常用APIDriverManagerDriverManager類包含一個(gè)Driver類,它們已通過調(diào)用方法DriverManager.registerDriver對自己進(jìn)行了注冊。所有Driver類都必須包含有一個(gè)靜態(tài)部分。它創(chuàng)建該類的實(shí)例,然后在加載該實(shí)例時(shí)DriverManager類進(jìn)行注冊。這樣,用戶正常情況下將不會(huì)直接調(diào)用DriverManager.registerDriver;而是在加載驅(qū)動(dòng)程序時(shí)由驅(qū)動(dòng)程序自動(dòng)調(diào)用。加載Driver類,然后自動(dòng)在DriverManager中注冊 可以通過如下方式:Class.forName("jdbc:sqlserver://ip:port;databaseName=TestDB”) 通過調(diào)用方法Class.forName。這將顯式地加載驅(qū)動(dòng)程序類。由于這與外部設(shè)置無關(guān),因此推薦使用這種加載驅(qū)動(dòng)程序的方法。8JDBC常用APIDriverManager加載Driver類并在DriverManager類中注冊后,它們即可用來與數(shù)據(jù)庫建立連接。當(dāng)調(diào)用DriverManager.getConnection方法發(fā)出連接請求時(shí),DriverManager將檢查每個(gè)驅(qū)動(dòng)程序,查看它是否可以建立連接。 以下代碼是通常情況下用驅(qū)動(dòng)程序建立連接所需所有步驟的示例:9JDBC常用APIDriverManager//加裁驅(qū)動(dòng)程序并自動(dòng)注冊連接實(shí)例Class.forName(“com.microsoft.sqlserver.dbc.SQLServerDriver");//設(shè)置URLStringurl="jdbc:sqlserver://ip:port;databaseName=TestDB";//設(shè)置用戶名和密碼Stringusername=“sa";Stringpassword=“sasa";//通過DriverManager向DB發(fā)出連接請求,獲得連接對象Connectionconn=DriverManager.getConnection(url,username,password);10JDBC常用APIConnection與數(shù)據(jù)庫的連接對象Connection對象代表與數(shù)據(jù)庫的連接。連接過程包括所執(zhí)行的SQL語句和在該連接上所返回的結(jié)果。一個(gè)應(yīng)用程序可與單個(gè)數(shù)據(jù)庫有一個(gè)或多個(gè)連接,或者可與許多數(shù)據(jù)庫有連接。Connectioncon=DriverManager.getConnection("jdbc:sqlserver://ip:port;databaseName=TestDB",“sa",“sasa");11JDBC常用APIConnection什么是JDBCURLJDBCURL提供了一種標(biāo)識(shí)數(shù)據(jù)庫的方法,可以使相應(yīng)的驅(qū)動(dòng)程序能識(shí)別該數(shù)據(jù)庫并與之建立連接。實(shí)際上,驅(qū)動(dòng)程序編程人員將決定用什么JDBCURL來標(biāo)識(shí)特定的驅(qū)動(dòng)程序。用戶不必關(guān)心如何來形成JDBCURL;他們只須使用與所用的驅(qū)動(dòng)程序一起提供的URL即可。JDBC的作用是提供某些約定,驅(qū)動(dòng)程序編程人員在構(gòu)造他們的JDBCURL時(shí)應(yīng)該遵循這些約定。JDBCURL的標(biāo)準(zhǔn)語法如下所示。它由三部分組成,各部分間用冒號(hào)分隔:jdbc:<子協(xié)議>:<子名稱>12JDBC常用APIStatement作用:完成發(fā)送SQL文SQL語句連接一旦建立,就可用來向它所涉及的數(shù)據(jù)庫傳送SQL語句。JDBC對可被發(fā)送的SQL語句類型不加任何限制。這就提供了很大的靈活性,即允許使用特定的數(shù)據(jù)庫語句或甚至于非SQL語句。然而,它要求用戶自己負(fù)責(zé)確保所涉及的數(shù)據(jù)庫可以處理所發(fā)送的SQL語句,否則將自食其果。例如,如果某個(gè)應(yīng)用程序試圖向不支持儲(chǔ)存程序的DBMS發(fā)送儲(chǔ)存程序調(diào)用,就會(huì)失敗并將拋出異常。JDBC提供了三個(gè)類,用于向數(shù)據(jù)庫發(fā)送SQL語句。Statement、PreparedStatement、CallableStatement13JDBC常用APIStatementConnection接口中的三個(gè)方法可用于創(chuàng)建這些類的實(shí)例。Statement─由方法createStatement所創(chuàng)建。Statement對象用于發(fā)送簡單的SQL語句。14JDBC常用APIStatement Statement對象用于將SQL語句發(fā)送到數(shù)據(jù)庫中。實(shí)際上有三種Statement對象,它們都作為在給定連接上執(zhí)行SQL語句的包容器:Statement、PreparedStatement(從Statement繼承而來)和CallableStatement(從PreparedStatement繼承而來)。它們都專用于發(fā)送特定類型的SQL語句: Statement對象用于執(zhí)行不帶參數(shù)的簡單SQL語句; PreparedStatement對象用于執(zhí)行帶或不帶IN參數(shù)的預(yù)編譯SQL語句; CallableStatement對象用于執(zhí)行對數(shù)據(jù)庫已存儲(chǔ)過程的調(diào)用。15JDBC常用APIStatement

Statement接口提供了執(zhí)行語句和獲取結(jié)果的基本方法。PreparedStatement接口添加了處理IN參數(shù)的方法;而CallableStatement添加了處理OUT參數(shù)的方法。

16JDBC常用APIStatement創(chuàng)建Statement對象 建立了到特定數(shù)據(jù)庫的連接之后,就可用該連接發(fā)送SQL語句。Statement對象用Connection的方法createStatement創(chuàng)建,如下列代碼段中所示:Connectioncon=DriverManager.getConnection(url,“sa",“123456a?");Statementstmt=con.createStatement();/*為了執(zhí)行Statement對象,被發(fā)送到數(shù)據(jù)庫的SQL語句將被作為參數(shù)提供給Statement的方法:*/ResultSetrs=stmt.executeQuery("SELECTa,b,cFROMTable2");

17JDBC常用APIStatement使用Statement對象執(zhí)行語句

Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery、executeUpdate和execute。使用哪一個(gè)方法由SQL語句所產(chǎn)生的內(nèi)容決定。方法executeQuery用于產(chǎn)生單個(gè)結(jié)果集的語句,例如SELECT語句。方法executeUpdate用于執(zhí)行INSERT、UPDATE或DELETE語句以及SQLDDL(數(shù)據(jù)定義語言)語句,例如CREATETABLE和DROPTABLE。INSERT、UPDATE或DELETE語句的效果是修改表中零行或多行中的一列或多列。executeUpdate的返回值是一個(gè)整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。對于CREATETABLE或DROPTABLE等不操作行的語句,executeUpdate的返回值總為零。方法execute用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合的語句。18JDBC常用APIStatement關(guān)閉Statement對象 Statement對象將由Java垃圾收集程序自動(dòng)關(guān)閉。而作為一種好的編程風(fēng)格,應(yīng)在不需要Statement對象時(shí)顯式地關(guān)閉它們。這將立即釋放DBMS資源,有助于避免潛在的內(nèi)存問題。19JDBC常用APIResultSet定義:ResultSet包含符合SQL語句中條件的所有行,并且它通過一套get方法(這些get方法可以訪問當(dāng)前行中的不同列)提供了對這些行中數(shù)據(jù)的訪問。ResultSet.next方法用于移動(dòng)到ResultSet中的下一行,使下一行成為當(dāng)前行。 結(jié)果集一般是一個(gè)表,其中有查詢所返回的列標(biāo)題及相應(yīng)的值。例如,如果查詢?yōu)镾ELECTname,age,jobsFROMTable1,則結(jié)果集將具有如下形式:

nameagejobsJerry80teacher20JDBC常用APIResultSet代碼示例:下面的代碼段是執(zhí)行SQL語句的示例。該SQL語句將返回行集合,其中列name和jobs為varchar,列age為int。Statementstmt=conn.createStatement(); ResultSetrs=stmt.executeQuery(“SELECTname,age,jobsFROMTable1”); while(rs.next()){ //輸出當(dāng)前行的值 Stringname=rs.getString(“name”); Stringjobs=rs.getString(“jobs”); intage=rs.getInt(“age”); }21連接數(shù)據(jù)庫的基本過程加載驅(qū)動(dòng)建立數(shù)據(jù)庫連接發(fā)送sql語句處理結(jié)果集釋放資源22加載驅(qū)動(dòng)1.絕對路徑引入2.使用類庫添加3.本項(xiàng)目內(nèi)相對路徑引入創(chuàng)建連接創(chuàng)建數(shù)據(jù)庫連接需要使用到DriverManager類和Connection接口。DriverManager類負(fù)責(zé)根據(jù)已經(jīng)加載的驅(qū)動(dòng)程序,按照規(guī)定格式的URL去連接指定的數(shù)據(jù)庫,并且返回Connection類型對象。這里說的URL是根據(jù)各數(shù)據(jù)庫系統(tǒng)的不同,各廠商分別提供了合格的URL,參看表8-2。連接數(shù)據(jù)庫服務(wù)器我們還需要擁有合法的數(shù)據(jù)庫用戶名和密碼,如果其中涉及到空白密碼,需要用連續(xù)兩個(gè)雙引號(hào)表示空白字符,切記不能不寫或者寫null。Stringurl=”jdbc:sqlserver://localhost:1433;databaseName=TestDB”;Stringusername=”sa”;Stringpswd=”sasa”;Connectionconnection=DriverManager.getConnection(url,username,pswd);執(zhí)行查詢語句JDBC中,使用Statement接口來執(zhí)行靜態(tài)的SQL語句,Statement對象由Connection對象獲得。Statementstmt=connection.createStatement();獲得Statement對象后,可以分別使用executeUpdate和executeQuery的方法來執(zhí)行增加、刪除、修改和查詢語句。Stringsql=”insertintotb_users(uname)values(‘tom’)”;intr=stmt.executeUpdate(sql);其中r表示sql變量所代表的SQL語句執(zhí)行過后,數(shù)據(jù)表中改變的記錄數(shù)量?;蛘逽tringsql=”selectuserid,unamefromtb_users”;ResultSetrs=stmt.executeQuery(sql);處理數(shù)據(jù)集//書寫查詢的SQL語句StringSQL="SELECTuserid,unameFROMtb_users";//獲得Statement對象Statementstmt=con.createStatement();//獲得查詢結(jié)果集ResultSetrs=stmt.executeQuery(SQL);//遍歷結(jié)果集while(rs.next()){//取出每一行中,兩個(gè)字段的數(shù)據(jù)值System.out.println(rs.getInt("userid")+""+rs.getString("uname"));}更新數(shù)據(jù)庫操作更新數(shù)據(jù)庫的操作由數(shù)據(jù)的插入(insert),刪除(delete),修改(update)構(gòu)成,這三種操作都會(huì)修改數(shù)據(jù)庫的數(shù)據(jù)文件,可以理解為數(shù)據(jù)庫寫入操作。//書寫插入的SQL語句StringSQL="insertintotb_users(uname)values('lilei')";//獲得Statement對象stmt=con.createStatement();//獲得執(zhí)行結(jié)果intresult=stmt.executeUpdate(SQL);//處理結(jié)果if(result>0){System.out.println("操作成功,影響"+result+"行記錄");}斷開與數(shù)據(jù)庫的連接作為程序編寫者,在程序完成對于數(shù)據(jù)庫的操作后,必須要關(guān)閉數(shù)據(jù)庫,釋放連接資源。關(guān)閉數(shù)據(jù)庫的步驟一般按照最先創(chuàng)建的最后關(guān)閉的順序來完成,對象的創(chuàng)建順序一般是Connection,Statement,ResultSet,所以關(guān)閉順序就是ResultSet,Statement,Connection。并且無論數(shù)據(jù)庫操作執(zhí)行成功與否,都不能一直占用數(shù)據(jù)庫連接,所以關(guān)閉數(shù)據(jù)庫操作多數(shù)與finally塊聯(lián)合使用。finally{//關(guān)閉ResultSetif(rs!=null)try{rs.close();}catch(Exceptione){ }//關(guān)閉Statementif(stmt!=null)try{stmt.close();}catch(Exceptione){}//關(guān)閉Connnectionif(con!=null)try{con.close();}catch(Exceptione){ }}應(yīng)用JDBC訪問SQLServer數(shù)據(jù)庫第一步:導(dǎo)入java.sql包importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;第二步:加載驅(qū)動(dòng)Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");方法參數(shù)中的字符串是驅(qū)動(dòng)程序的全限定名,可以在驅(qū)動(dòng)程序文檔或者驅(qū)動(dòng)程序jar文件中找到。第三步:創(chuàng)建數(shù)據(jù)庫連接StringconnectionUrl="jdbc:sqlserver://localhost:1433;databaseName=TestDB";Connectioncon=DriverManager.getConnection(connectionUrl,"sa","sasa");創(chuàng)建連接時(shí)需要根據(jù)不同的數(shù)據(jù)庫系統(tǒng)編寫不同的連接URL,還需要數(shù)據(jù)庫管理員給定的用戶名和密碼方可完成。不同的數(shù)據(jù)庫的URL都有不同,參考驅(qū)動(dòng)程序文檔和自帶的示例程序即可。第四步:創(chuàng)建Statement對象Statementstmt=con.createStatement();Statement對象是用來執(zhí)行SQL語句的工具類對象,創(chuàng)建之前必須確定Connection對象已經(jīng)初始化完畢。第五步:書寫SQL語句StringSQL="insertintotb_users(uname)values('lilei')";作為基礎(chǔ)教學(xué)來說,固定值的SQL語句是讀者必須要掌握的技能,但在實(shí)際應(yīng)用中,這種類型的SQL不多。本次insert操作中,為uname字段指定了lilei的數(shù)據(jù)值,則本條SQL語句僅能夠完成固定值的插入,如何能夠在SQL語句中加入變量?一般的解決方法是將原有SQL語句進(jìn)行拆分后,連入變量,再重新組合成完整的SQL語句,所用到的技術(shù)是Java語言字符串的拼接操作,具體原理請看下圖:用變量s表示”lilei”,SQL語句由3部分拼接而成,第一部分是SQL語句的固定部分,第二部分是變量s,第三部分還是SQL語句的固定部分。要特別注意的是第一部分結(jié)尾和第三部分開頭的單引號(hào),一定不能省略,這種SQL語句拼接需要同時(shí)滿足Java中字符串的格式規(guī)定和SQL語句的語法規(guī)定。第六步:執(zhí)行SQL語句in

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論