理工課件-java基礎3-數據庫10jdbc_第1頁
理工課件-java基礎3-數據庫10jdbc_第2頁
理工課件-java基礎3-數據庫10jdbc_第3頁
理工課件-java基礎3-數據庫10jdbc_第4頁
理工課件-java基礎3-數據庫10jdbc_第5頁
免費預覽已結束,剩余42頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

JAVA核心技術JDBC本章相關詞匯單詞說明driver驅動,驅動程序connection連接statement語句prepared預備的,預編譯的result結果create創建,創造execute執行query查詢JDBC了解JDBC的概念和必要性了解JDBC驅動程序類型了解java.sql包使用JDBC進行數據庫編程PreparedStatement接口純Java驅動方式連接不同數據庫JDBC了解JDBC的概念和必要性了解JDBC驅動程序類型了解java.sql包使用JDBC進行數據庫編程PreparedStatement接口純Java驅動方式連接不同數據庫數據庫訪問技術簡介當今企業級應用程序大部分采用了客戶機/服務器(C/S)模式;客戶端機器需要與服務器進行通訊,要操作數據庫中的數據,執行SQL(StructuredQueryLanguage結構化查詢語言)語句以及檢索查詢結果;在Java中實現這些活動的技術稱作JDBC。數據庫編程示意圖

客戶機/服務器應用程序

數據庫編程JDBC數據庫執行SQL語句檢索查詢結果

關于DBMSDBMS(DataBaseManagementSystem)是指數據庫管理系統;目前DBMS的生產商眾多,產品也不盡相同,如:Oracle公司的Oracle系列;Microsoft公司的Access系列和SQLServer系列;Microsoft公司早期的FoxPro;IBM公司的DB2;Sybase公司的Sybase;還有自由開源的MySQL等等。這就意味著編程語言要針對不同的DBMS開發不同版本的應用程序,這將是一項非常枯燥的工作。ODBCODBC(OpenDataBaseConnectivity)指開放式數據庫連接,是由Microsoft公司提供的應用程序接口;它負責連接各種不同產商和類型的DBMS,然后為各種不同的編程語言提供查詢、插入、修改和刪除數據的功能;如同在各種不同的DBMS和各種不同的編程語言之間架設了一座通用的橋梁。JDBCJDBC(JavaDataBaseConnectivity)是由SunMicrosystem公司提供的API(ApplicationProgrammingInterface應用程序編程接口);它為Java應用程序提供了一系列的類,使其能夠快速高效地訪問數據庫;這些功能是由一系列的類和對象來完成的,我們只需使用相關的對象,即可完成對數據庫的操作。JDBC工作方式示意圖

Java程序

JDBC驅動程序數據庫SQL命令

結果

JDBC驅動程序類型使用JDBC連接數據庫可以通過不同的驅動方式來實現,有4種驅動類型:JDBC-ODBC橋驅動純Java驅動本地API部分Java驅動JDBC網絡純Java驅動不論采用哪種驅動方式,在程序中對數據庫的操作方式基本相同,只是加載不同的驅動程序即可。java.sql包java.sql包也是Java內置的包,其中包含了一系列用于與數據庫進行通信的類和接口;如果要使用到這些類和接口的話,則必須顯式地聲明如下語句:

importjava.sql.*;java.sql包中的一些接口接口名稱說明Connection連接對象,用于與數據庫取得連接Driver用于創建連接(Connection)對象Statement語句對象,用于執行SQL語句,并將數據檢索到結果集(ResultSet)對象中PreparedStatement預編譯語句對象,用于執行預編譯的SQL語句,執行效率比Statement高ResultSet結果集對象,包含執行SQL語句后返回的數據的集合java.sql包中的一些類類名稱說明SQLException數據庫異常類,是其它JDBC異常類的根類,繼承于java.lang.Exception,絕大部分對數據庫進行操作的方法都有可能拋出該異常DriverManager驅動程序管理類,用于加載和卸載各種驅動程序,并建立與數據庫的連接Date該類中包含有將SQL日期格式轉換成Java日期格式的方法TimeStamp表示一個時間戳,能精確到納秒Java.util.Date是java.sql.Date和java.sql.Timestamp的父類java.sql.Date是針對SQL語句使用的,它只包含日期而沒有時間部分java.sql.Timestamp彌補了java.sql.Date的缺陷,保存日期時間精確納秒java.util.Date除了SQL語句的情況下面使用java.sql.Date和java.sql.Timestamp及java.util.Date的區別和使用三者都可以通過getTime()進行互相轉換//獲取系統當前時間

java.util.Dateud=newjava.util.Date();

//將java.util.Date轉化成java.sql.Datejava.sql.Datesd=newjava.sql.Date(ud.getTime());//將java.util.Date轉化成java.sql.Timestampjava.sql.Timestamptime=newjava.sql.Timestamp(ud.getTime());//將java.sql.Date轉化成java.util.Dateud=newjava.util.Date(sd.getTime());//將java.sql.Timestamp轉化成java.util.Dateud=newjava.util.Date(time.getTime());java.sql.Date和java.sql.Timestamp及java.util.Date的相互轉換JDBC程序訪問數據庫步驟開始導入java.sql包加載并注冊驅動程序創建Connection對象創建Statement對象執行SQL語句關閉ResultSet對象關閉Statement對象關閉Connection對象使用ResultSet對象建立數據源(ODBC)附加相應產商提供的驅動結束JDBC-ODBC橋方式純Java驅動方式步驟詳解1:建立數據源這里以鏈接oracle數據庫為例1.找到oracle安裝路徑的JAR包—ojdbc14.jar復制到項目中與src同級文件夾lib中,并導入到項目,地址如下:E:\oracle\product\10.2.0\db_1\jdbc\lib步驟詳解2:加載驅動程序1.使用Class類的forName方法,將驅動程序類加載到JVM(Java虛擬機)中,代碼如下:對于鏈接oracle數據庫的驅動方式,應該加載:Class.forName("oracle.jdbc.driver.OracleDriver");方法原型說明staticClassforName(StringclassName)throwsClassNotFoundException將由className指定完整名稱的類加載到JVM中,如果加載失敗,將拋出異常,必須捕捉步驟詳解3:獲得連接對象方法原型說明staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)throwsSQLException參數url是連接字符串,參數user是數據庫用戶名,參數password是登錄口令,成功連接到數據庫返回Connection對象,連接失敗則拋出SQLException異常,必須捕捉成功加載驅動后,必須使用DriverManager的靜態方法getConnection來獲取鏈接對象。對于鏈接Oracle數據庫方式如下:Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");步驟詳解釋4:創建語句對象一旦成功連接到數據庫,獲得Connection對象后,必須通過Connection對象createStatement方法來創建語句對象,才可以執行SQL語句;Statementsta=con.createStatement();方法原型說明StatementcreateStatement()throwsSQLException成功創建返回Statement對象,否則拋出SQLException異常,必須捕捉步驟詳解5:執行SQL語句使用語句對象來執行SQL語句,有兩種情況:一種是執行DELETE、UPDATE和INSERT之類的數據庫操作語句(DML),這樣的語句沒有數據結果返回,使用Statement對象的executeUpdate方法執行;如:intrs=st.executeUpdate("insertintoperson(pid,pname)values(4,'mxt')");方法原型說明intexecuteUpdate(Stringsql)throwsSQLException參數sql是要執行的SQL語句,執行成功返回受影響的行數,執行失敗則拋出SQLException異常,必須捕捉步驟詳解5:執行SQL語句(續)另一種是執行SELECT這樣的數據查詢語句(DQL),這樣的語句將從數據庫中獲得所需的數據,使用Statement對象的executeQuery方法執行;如:ResultSetrs=null;

rs=st.executeQuery("select*frompersonwherepid="+pid);while(rs.next()){System.out.println("編號:"+rs.getInt("pid")+"姓名:"+rs.getString("pname"));}方法原型說明ResultSetexecuteQuery(Stringsql)throwsSQLException參數sql是要執行的SQL語句,查詢成功返回包含有結果數據的ResultSet對象,否則拋出SQLException異常,必須捕捉步驟詳解6:關閉資源當對數據庫的操作結束后,應當將所有已經被打開的資源關閉,否則將會造成資源泄漏;Connection對象、Statement對象和ResultSet對象都有執行關閉的close方法;函數原型都是:voidclose()throwsSQLException如:

rs.close();//關閉ResultSet對象

sta.close();//關閉Statement對象

con.close();//關閉Connection對象有可能拋出SQLException異常,必須捕捉;請注意關閉的順序,最后打開的資源最先關閉,最先打開的資源最后關閉。數據庫操作示例DMLConnectioncon=null;Statementst=null;intrs=0;try{Class.forName("oracle.jdbc.driver.OracleDriver");con=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");st=con.createStatement();rs=st.executeUpdate("insertintoperson(pid,pname,pgender,page,pmsg)values(4,'mxt','女',25,'今天天氣很不錯')");if(rs>0){System.out.println("添加成功");}else{System.out.println("添加失敗");}}catch(Exceptione){System.out.println(e.toString());}finally{

try{if(st!=null){st.close();}if(con!=null){con.close();}}catch(Exceptione2){System.out.println(e2.toString());}}}數據庫操作示例DQLSystem.out.println("請輸入要查詢的學生編號:");Scannerscanner=newScanner(System.in);Stringpid=scanner.nextLine();Connectioncon=null;Statementst=null;ResultSetrs=null;try{//注冊驅動類Class.forName("oracle.jdbc.driver.OracleDriver");con=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");st=con.createStatement();rs=st.executeQuery("select*frompersonwherepid="+pid);while(rs.next()){System.out.println("編號:"+rs.getInt("pid")+"姓名:"+rs.getString("pname"));}}catch(Exceptione){e.printStackTrace();}finally{try{if(rs!=null){rs.close();}if(st!=null){st.close();}if(con!=null){con.close();}}catch(Exceptione2){}}}操作結果集使用Statement對象的executeQuery方法成功執行SELECT語句后,將返回一個包含有結果數據的ResultSet對象,要從該對象中獲取數據,將使用到如下方法:方法原型說明booleannext()throwsSQLException將結果集游標往下移動一行,如果已經到達結果集最后,將會返回false,有可能拋異常,必須捕捉XgetX(StringcolumnName)throwsSQLException獲得某個字段的值,X是指具體的數據類型,視數據庫表中字段的具體情況而定,該方法有一組,并且每個都有兩種重載方法,一種是以字段名稱為參數,另一種是以字段索引為參數(字段索引從1開始),有可能拋異常,必須捕捉XgetX(intcolumnIndex)throwsSQLException操作結果集示例try{StringstrCon="jdbc:odbc:dsn_javaBase";System.out.println("正在連接數據庫...");Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncon;con=DriverManager.getConnection(strCon,"sa",“sa");System.out.println("成功連接到數據庫。");Statementsta=con.createStatement();ResultSetrs=sta.executeQuery("SELECT*FROMFriends");System.out.println("查詢到數據如下:");

while(rs.next()){//循環將結果集游標往下移動,到達末尾返回false

//根據字段名稱獲得各個字段的值

System.out.print(rs.getString("Name")+"\t");//獲得字符串

System.out.print(rs.getString("Address")+"\t");//獲得字符串

System.out.print(rs.getInt("Telephone")+"\t");//獲得整數

System.out.print(rs.getDate("HireDate")+"\t");//獲得日期型數據

System.out.println(rs.getFloat("Salary"));//獲得浮點型數據

}rs.close();sta.close();con.close();}catch(ClassNotFoundExceptioncnfe){cnfe.printStackTrace();}

catch(SQLExceptionsqle){sqle.printStackTrace();}1PreparedStatemend和Statement區別Statement(語句對象)PreparedStatemend(預編譯語句對象)1.PreparedStatement是預編譯的,對于批量處理可以大大提高效率.也叫JDBC存儲過程2.在對數據庫只執行一次性存取的時侯PreparedStatement對象的開銷比Statement大3.statement每次執行sql語句,相關數據庫都要執行sql語句的編譯,preparedstatement是預編譯的,

preparedstatement支持批處理4.PreparedStatement對象不僅包含了SQL語句,而且該語句如果已經被編譯過,那么當該語句僅僅只是修改變量后再次執行的時候,只需DBMS運行SQL語句,而不必編譯。所以PreparedStatement對象將會大大減少運行時間,當然也加快了訪問數據庫的速度。5.然而,在Oracle環境中,開發人員實際上有更大的靈活性。當使用Statement或PreparedStatement對象時,Oracle數據庫會緩存SQL語句以便以后使用。在一些情況下,由于驅動器自身需要額外的處理、在Java應用程序和Oracle服務器間增加的網絡活動,執行PreparedStatement對象實際上會花更長的時間。6.然而,除了緩沖的問題之外,至少還有一個更好的原因使我們在企業應用程序中更喜歡使用PreparedStatement對象,那就是安全性。傳遞給PreparedStatement對象的參數可以被強制進行類型轉換,使開發人員可以確保在插入或查詢數據時與底層的數據庫格式匹配。PreparedStatement接口1如果要多次執行相似的SQL語句,可以使用PreparedStatemend(預編譯語句對象)對象來執行;通過Connection對象的prepareStatement方法來創建預編譯語句對象;PreparedStatement對象會將SQL語句預先編譯,這樣將會獲得比Statement對象更高的執行效率。方法原型說明PreparedStatementprepareStatement(Stringsql)throwsSQLException參數sql是要執行的SQL語句,根據指定的SQL語句創建PrepareStatement對象,有可能拋異常,必須捕捉PreparedStatement接口2包含在PreparedStatement對象中的SQL語句可以帶有一個或多個參數,使用“?”作為占位符,如:PreparedStatement

ps=con.prepareStatement("insertintoperson(pid,pname)values(?,?)");在執行SQL語句之前,必須使用PreparedStatement對象中的setX方法設置每個“?”位置的參數值;如: ps.setString(1,5); ps.setString(2,"陳老師");方法原型說明voidsetX(intparameterIndex,Xx)throwsSQLException將parameterIndex指定的“?”位置指定為x的值,這里X可以指代任意數據類型,“?”的索引從1開始。PreparedStatement接口3設置好每個參數的值之后,就可以使用PreparedStatement對象的executeUpdate和executeQuery方法來執行SQL語句,這一點和Statement對象很相似:方法原型說明intexecuteUpdate()throwsSQLException用于執行INSERT、DELETE和UPDATE語句,執行成功返回受影響的行數,否則拋出SQLException異常,必須捕捉ResultSetexecutQuery()throwsSQLException用于執行SELECT語句,執行成功返回包含有結果數據的ResultSet對象,否則拋出SQLException異常,必須捕捉intresult=ps.executeUpdate();//增,刪,改ResultSetrs=ps.executeQuery();//查詢PreparedStatement對象示例(DML)try{Class.forName("oracle.jdbc.driver.OracleDriver");}catch(ClassNotFoundExceptione){e.printStackTrace();}Connectioncon=null;ResultSetrs=null;PreparedStatementps=null;try{con=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");ps=con.prepareStatement("insertintoperson(pid,pname,pgender,page,pmsg)values(?,?,?,?,?)");ps.setString(1,"5");ps.setString(2,"陳老師");ps.setString(3,"女");ps.setInt(4,27);ps.setString(5,"xxxxxxx");intresult=ps.executeUpdate();if(result>0){System.out.println("添加成功");}else{System.out.println("添加失敗");}}catch(SQLExceptione){e.printStackTrace();}finally{try{if(rs!=null){rs.close();}if(ps!=null){ps.close();}if(con!=null){con.close();}}catch(SQLExceptione){e.printStackTrace();}}}PreparedStatement對象示例(DQL)try{Class.forName("oracle.jdbc.driver.OracleDriver");}catch(ClassNotFoundExceptione){e.printStackTrace();}System.out.println("請輸入要查詢的老師編號");Scannerscan=newScanner(System.in);Stringtid=scan.nextLine();Connectioncon=null;PreparedStatementps=null;ResultSetrs=null;try{con=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");ps=con.prepareStatement("select*frompersonwherepid=?");ps.setString(1,tid);rs=ps.executeQuery();while(rs.next()){System.out.println("編號:"+rs.getInt("tid")+"姓名:"+rs.getString("tname"));}}catch(SQLExceptione){e.printStackTrace();}finally{try{if(rs!=null){rs.close();}if(ps!=null){ps.close();}if(con!=null){con.close();}}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}純Java驅動方式連接數據庫使用JDBC-ODBC橋方式連接數據庫,其性能完全取決于數據源(ODBC)的性能,并且無法脫離Microsoft的平臺,這樣將帶來不便;大部分DBMS產商都為自己的產品開發了純Java的驅動程序,我們只需要加載相應的驅動,就可以直接連接到數據庫,而無需通過ODBC橋連接;下載驅動程序包要使用純Java驅動,首先必須獲得相應數據庫的驅動程序包;根據數據庫的類型,登錄對應產商的官方網站,一般都可以免費獲得;下載后,復制到本地磁盤,并將完整路徑設置到classpath環境變量中,如用開發工具開發程序,還需在開發環境中設置路徑。純Java驅動連接SQLServer2000使用純Java驅動連接到SQLServer2000數據庫,加載驅動程序應改成如下語句:

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");連接字符串應如下格式:"jdbc:microsoft:sqlserver://服務器名或IP:1433;databaseName=數據庫名"如:

Connectioncon=DriverManager.getConnection("jdbc:microsoft:sqlserver://:1433;databaseName=pubs","sa","");純Java驅動連接SQLServer2005使用純Java驅動連接到SQLServer2005數據庫,加載驅動程序應改成如下語句:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");連接字符串應如下格式:

"jdbc:sqlserver://服務器名或IP:1433;databaseName=數據庫名"如:

Connectioncon=DriverManager.getConnection("jdbc:sqlserver://:1433;databaseName=pubs","sa","sa");純Java驅動連接MySQL使用純Java驅動連接到MySQL5.0數據庫,加載驅動程序應改成如下語句:

Class.forName("com.mysql.jdbc.Driver");連接字符串應如下格式:

"jdbc:mysql://服務器名或IP:3306/數據庫名"如:

Connectioncon=DriverManager.getConnection("jdbc:mysql://:3306/test","root","root");

純Java驅動連接Oracle使用純Java驅動連接到Oracle9i數據庫,加載驅動程序應改成如下語句:

Class.forName("oracle.jdbc.driver.OracleDriver");連接字符串應如下格式:

"jdbc:oracle:thin:@服務名或IP:1521:數據庫名"如:

Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@:1521:test","scott","tiger");改進數據庫連接(屬性)//驅動類public

static

finalStringDRIVER="oracle.jdbc.driver.OracleDriver";//字段,數據庫連接字符串public

static

finalStringURL="jdbc:oracle:thin:@:1521:orcl";//用戶名public

static

finalStringUID="oa";//密碼public

static

finalStringPWD="oa";//數據庫連接對象Connectioncon=null;//數據庫預編譯處理對象PreparedStatementps=null;//結果集對象ResultSetrs=null;改進數據庫連接(連接對象)/***返回數據庫連接對象**@return*/publicConnectiongetCon(){try{Class.forName(DRIVER);}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.pri

溫馨提示

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

評論

0/150

提交評論