java開發(fā)技術-第17章對數據庫編程_第1頁
java開發(fā)技術-第17章對數據庫編程_第2頁
java開發(fā)技術-第17章對數據庫編程_第3頁
java開發(fā)技術-第17章對數據庫編程_第4頁
java開發(fā)技術-第17章對數據庫編程_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

17Java為客戶端和服務器端兩個部分。Java的設計意圖是將它用于服務器端,而將客戶端交給其JavaDelphi、VB的一個重要區(qū)別是,它不提供可視化的數據庫感應控件,因而編寫客戶端時如果采用Java作為開發(fā)工具會有比較多的編程Java無論何種工具,要處理數據庫必須做的第一件事情就是對數據進行連接。Java提供了多種連接方式,這都是通過JDBC來進行的。本節(jié)將介紹JDBC的使用。JDBCJava數據庫連接(JavaDatabaseConnectivity)的簡寫,是一組用于連接數據庫以及執(zhí)行SQL語句的API。它允許用戶從JAVA程序中任何支持SQL的關系型數據庫,也允許用戶其他的表格數據源,如Excel表格。JDBC最大的特點是無論是何種數據庫,對于Java程序員而言,它的工作方式完全相同。JDBC為許多不同的數據庫連接模塊的前端提供了統(tǒng)一的接口,這樣就不用為連DriverManager類建立與數據源的連接,這個連接將作為一個數據操作的起點,用類中相應的excute方法來執(zhí)行SQL命令。ResultSet結果集,程序接著遍歷這個源的驅動程序。JDBC有四種連接方部分JavaJDBC-Net純Java驅動方式和本地協(xié)議純Java驅動方JDBC-ODBC橋加上ODBCODBCWindows平臺上使用最廣泛的標準連接驅動。所有能在Windows上運行的數據庫系統(tǒng)都提供何在本地機器上配置ODBC數據:果是WindowsXP,該圖標在“管理17.1所示的窗口。(DSN數據源的類型。這里Access。JDBC要通過它來連接數據庫文件。單擊圖

17.1ODBC17.217.3這里將數據源的名稱命名為“otudy”,請記住該名稱,后面編程要用到。然后單第16的ple.bAPI與數據源系統(tǒng)通JavaAPI留在客戶層上并直接與數據庫服務器進行 圖17.4本地API連接方JDBC-ODBC更快,但它InternetJavaNativeInterfaceJVM的JDBC-Net純Java驅動程這種連接方式的驅動程序采用一種三層化方法,JDBC數據庫請求憑借這種方法,被用Java編寫成的,它可以使用前面介紹的兩種類型的JDBC驅動程序來完成這些工作,這17.5JDBC-NetJDBC驅動程序(KB)在客戶機上執(zhí)行,并通過網絡把SQL命令傳遞給JDBC服務器,然后接收來自服務器的數據,并管理連接。這種方式考慮到了在Internet上的部署。這種方式的優(yōu)點是顯而易見的:大多數的三層Web應用程序都涉及到安全、以及,而這類驅動程序一JavaJava程序,不需要和安全性。不過,當數據庫變成一個不同開發(fā)商產品時(盡管這種情形很少見,但不能完全排除),不能使用同一個JDBC驅動程序,需要替換該驅動程序。JDBCDBMSJava驅動程序。這些驅動程個連接方式如圖17.6所示。17.6這種方式的缺點在于,程序員需要給每個數據庫使用不同的JDBC驅動程序。相對而言,在Windows平臺上使用第式較多,在Linux/Unix平臺上使用第四為解決這一問題,JDBC使用了“連接池”的概念。在連接池中,保存了若干已經建替原有通過DriverManager類來獲得數據庫連接的方式。一javax.sql.DataSource接口的ContextContextctx=newDataSourceds=(DataSource)應的Connection對象。而如果當前的DataSource對象支持數據庫連接池,應用程序將自動行數據的操作,完成操作后應顯式地調用close()關閉數據庫連接。持連接池的實現,而連接池的具體實現,JDBC3.0規(guī)范并沒有做相關的規(guī)定。通過這個框JDBC3.0JDBCDriver級和ApplicationServerJDBCDriver級的實現中,任何相關的工作均由特定數據庫廠商JDBCDriverJDBCDriver既需要提供對數據庫連接池的支ApplicationServer級中數據庫連接池JDBCDriverApplicationServer開發(fā)人員,共同實現數據庫連接池的實現(ApplicationServer廠商實現的連接池的機制和規(guī)范中提到有差異)JDBCDriver提供數據庫連接池的支持,而特定的ApplicationServer廠商提供數據庫連接池的具體實現。消,這種取消動作被稱為“回滾(rollback)”。JDBC中的事務操作是基于同一個數據連方法,都位于接口java.sql.Connection中。在JDBC中,事務操作默認是自動提交。也就是說,一條對數據庫的更新表達式代表 數據庫操作的表達式作為一個事務,在操作完成后調用commit()來進行整體提交,倘若其中一個表達式操作失敗,都不會執(zhí)行到commit(),并且將產生相應的異常。此時,就可以trytryconn=stmt=conn.createStatement();自動提交,設置回//數據庫更新操作}catch(Exceptiontry{}catch(Exception{}//事務//操作不成功則JDBCAPI5種操作支持,2種加鎖密度。5種staticintTRANSACTION_NONE:事務操作和加鎖staticintTRAN 重復讀寫(repeatablereads)和影象讀寫(phantomreads)staticintTR staticintTRANSACTION_SERIALIZABLE:臟數據讀寫、重復讀寫和允許影臟數據讀寫(dirtyreads):當一個事務修改了某一數據行的值而未提交時,另一(臟數據)重復讀寫(repeatablereads):當一個事務在某一數據行時,另一事務同時在JDBC根據數據庫提供的默認值來設置事務支持及其加鎖,它有兩種加鎖密度:分別Settransactionisolation(int 注意:某些數據庫(如oracle)中,數據庫驅動對事務處理的默認值是TRANSACTION_來說,對于只涉及到數據庫的查詢操作時,可以采用TRANSACTION_READ_MITTED方式;對于數據查詢遠多于更新的操作,可以采用TRANSACTION_ 方式;對于更新操作較多的,可以采用TRANSACTION_REPEATABLE_READ;在數據一致性要求更高的場合再考慮最后一項,由于涉及到表Java5種基本操作:增、刪、改、查找和排序。在Java中,這些操作都是通過SQL語言來實現的。DriverManager 正如名稱所示,該方法將建立與數據庫的連接。JDBC允許用戶調用DriverManagergetDriver()、getDrivers()registerDriver()。但多數情況下,DriverManager類自己Connection封裝了對數據庫連接的操作。一般情況下,Connetction對象是由DriverManager.getConn-ection()方法來得到的,程序只需要獲取該方法返回的一個指向Connection對象的,就可以對數據庫進行操作。Connection的方法比較多,但多數情況下,程序員只需要用到下體的SQL命令。Statement方法來執(zhí)行SQL命令:ResultSetexecuteQuery(Stringsql)sql命令,返回一個結果集合。通常用于執(zhí)行SELECT命令。于執(zhí)行INSERT、UPDATE或DELETE命令。表示返回了一個結果集,需要用getResultSet()方法獲取這個結果集,也可以使用getMoreResults()獲取子結果集。如果為false,表示沒有結果集,只需要調用PreparedStatementStatement類似SQL命令進行預編譯,對于需要多次執(zhí)行SQL語句而言,量轉換成為SQL語句中的變量,并降低出錯的可能性。它用來接受SQL語句執(zhí)行后的結果,程序員可以通過next()、previous()等方法來關于這個接口,將在17.2.7中詳細介紹。try-catch語句塊中。注意,這里是加載ODBC驅動,無論是何種數據庫,該驅動程序動程序。例如,是MySQL,加載驅動程序的代碼是:java.sqlConnection類來聲staticstaticConnectiongetConnection(Stringurl,Stringuser,Stringjdbc:odbc:jdbc:odbc:數據源注意:這里是數據源而非數據庫名令均為空。這就是第16章建立的數據庫,以及17.1節(jié)配置的ODBC數據源。//-----------連接數據庫示例程序段,程序編 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加載數據庫ConnectionConnection("jdbc:odbc:forStudy","","");//這里是ODBC}catch(ClassNotFoundException}種異常情況,程序就不會按照正常流程運行,就可close()方法沒有被調用的情況,//-----------關閉數據庫示例程序段,程序編 Connection}catch(ClassNotFoundExceptioncon.close();//el){}//endtry-}//end}//endtry-catch-SQLStatementexecuteUpdate()方法就可】room、6個字段(如果您的數據庫中該表的字段不是這個樣子,請將其設置成這樣6個字 //-----------程序名insertData.java,程序編號17.3publicclassinsertDatapublicstaticvoidmain(String[]{Connectioncon=null;Statementstmt;//要執(zhí)行的SQL語StringsqlString="insertintostudentvalues('30小王','男'湖南湘潭','N- //連接數//執(zhí)行插入e){e){}}}}錯的事。例變量:code="30",name="小王",sex="男",address="湖南湘潭", sqlString="insertsqlString="insertintostudentvalues('code','name','sex','address', sqlString="insertsqlString="insertintostudentvalues('"+code+"','"+name+"','"+sex+"','"+address+"','"+room+"','"+ +"',)";//-----------程序名insertData.java,程序編號17.4importjava.io.*;publicclassinsertDatapublicstaticvoidmain(String[]{Connectioncon=null;Statementstmt;Stringname,sex,address,code,room, //拼裝SQLsqlString="insertintostudentvalues('"+code+"','"+name++sex+"','"+address+"','"+room+"','"+e){e){}}}publicstaticStringgetInput(Stringmsg){Stringresult=null;BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));e){}return}}17.717.4SQL命令可以使用的字符串是件很sqlString="insertintostudentvalues(?,?,?,?)";//?就是占位

//替換第一個占位//替換第四個占位等來賦值。整個程序如程序17.5所示://-----------程序名insertData.java,程序編號17.5importjava.io.*;publicclassinsertDatapublicstaticvoidmain(String[]{Connectioncon=null;PreparedStatementps;StringsqlString;Stringname,sex,address,code,room, sqlString="insertsqlString="insertintostudentvalues(?,?,?,?,?,?)";ps.setString(1,code);//替換第一個占位符 ps.executeUpdate()SQL命令e){e){}}}publicstaticStringgetInput(Stringmsg){Stringresult=null;BufferedReaderin=newBufferedReader(newInputStreamReadere){}return}}SQLdelete即可。delete命令本身比較JavaSQL命令字符串之間的差異。下面是一個簡//-----------程序名deleteData.java,程序編號17.6importjava.io.*;publicclassdeleteDatapublicstaticvoidmain(String[]{ConnectionStatementStatementStringsqlString="deletefromstudentwherecode='"+code+"'";//e){e){}}}publicstaticStringgetInput(Stringmsg){Stringresult=null;BufferedReaderin=newBufferedReader(newInputStreamReadere){}return}}//-----------程序名updateData.java,程序編號17.7importjava.io.*;publicclassupdateDatapublicstaticvoidmain(String[]{ConnectionStatementstmt;Statementstmt;intk;sqlString="updatestudentsetsex='女wheresex='男'";//執(zhí)行SQLe){e){}}}}SELECTResultSet集中,遍歷這個集此ResultSet提供了大量的方法供程序員來管理這根游標。ResultSet的方法非常多,表17.1列出了其中一些常用的方17.1ResultSet booleanabsolute(int將游標移動到指定行位置(絕對值voidvoidvoidvoidvoid立即關閉與結果集連接的數據庫并釋放JDBCvoidintfindColumn(Stringboolean BigDecimalgetBigDecimal(intbooleangetBoolean(intbytegetByte(intStringdoublegetDouble(intintgetInt(intlonggetLong(intintshortgetShort(String成為short數據Statement返回與結果集相關聯(lián)的Statement對StringgetString(int成為Stringintvoidbooleanbooleanbooleanbooleanbooleanvoidvoidbooleanbooleanvoidbooleanrelative(int將游標移動到相對于當前位置差rows行的booleanbooleanbooleanvoidupdateByte(intcolumnIndex,byte voidupdateDate(intcolumnIndex,DatevoidupdateDouble(intcolumnIndex,doublevoidupdateInt(intcolumnIndex,intvoidupdaong(intcolumnIndex,longvoidvoidupdateShort(StringcolumnName,shortboolean測試讀入進來的最后一列是否為SQLNULL//-----------程序名queryData.java,程序編號17.8importjava.sql.importjava.sql.*;importjava.io.*;publicclassqueryData{publicstaticvoidmain(String[]{Connectioncon=null;Statementstmt;ResultSetrs;//執(zhí)行查詢命令,并獲取返回rs=stmt.executeQuery("select*fromname=rs.getString("name");//獲取name字段的內容 //獲取sex字段的內容System.out.println(name+""+sex+""+address+"}e){e){}}//try}//method}//classJavaGUI界面的數據庫17.8這里用到的數據庫仍然是前面的FirstExample,ODBC數據源名稱為forStudy,表名是student,擁6個字段,如17.2所示:17.2student類長含學生代碼(學號是否2否否否否注意:某些數據庫不支持數據集的這些功能,只能用相應的SQL 一般情況下,這種MIS程序有三種編程思路:也可以刪除記錄。這需要精確記錄游標的位置和記錄條數。ResultSet對這兩項的支持都很protectedprotectedint//publicstaticfinalintonlyRead=0,adding=1,amending=2;//protectedint //記錄ResutlSet不能直接獲取記錄總數,需要使用SQLselectcount(*)from t的值首先來設計程序的界面,這個比較簡單,用第14章介紹的知識就可以輕松完成,只//-----------程序名AddressList.java,程序編號17.9importjavax.swing.importjavax.swing.*;importjava.awt.*;importjava.sql.*;publicclassAddressListextends Containercon; Connectionconn=null;Statementstmt=null;ResultSetrs=null;protectedintrecordState=onlyRead, publicstaticfinalintonlyRead=0,adding=1,amending=2;publicstaticfinalStringlb privatestaticfinal publicAddressListmainJframenewJFrame("學生信息管理con.setLayout(newBoxLayout(con,BoxLayout.Y_AXIS));pane=newJPanel[4];for(inti=0;i++){pane[i]=newJPanel();}fieldText=newJTextField[ lbl=newJLabel[ for(inti=0; i++){fieldText[i]=newJTextField();lbl[i]=newJLabel(); }firstBtn=newJButton("第一條");preBtn=newJButton("前一條");nextBtn=newJButton("后一條");lastBtn=newJButton("最后一條");addBtn=newJButton("增加記錄");editBtn=newJButton("編輯記錄");delBtn=newJButton("刪除記錄");cancelBtn=newJButton("取消改變");saveBtn=newJButton("保存記錄");for(inti=0;i<4;i++)if( t>0)showDate();}protectedvoidsetFace(){}publicstaticvoidmain(String[]{new}}其中的connection()和showDate()方法將在后面介紹。這里實際上已經提供了本程序的框架,后面的代碼都要添加在AddressList.java文件中。注意:某些數據庫不支持這些功能用兩條SQL語句來完成。打開數據庫寫成一個方法,代碼如下:publicvoidconnection(){publicvoidconnection(){try{rs=stmt.executeQuery("selectcount(*)fromstudent");t=rs.getInt(1);//rs=stmt.executeQuery("selectcode,name,sex,address,room,fromstudent"); //將游標移動到第一條記JOptionPane.showMessageDialog(mainJframe,"數據庫無法連接或沒有記錄{}}以需要將關閉數據庫的代碼寫在windowClosing事件的響應代碼中。程序如下:////退出系統(tǒng)時要關閉數publicvoidwindowClosing(WindowEventel){try{e){}}publicvoidshowDate(){ }為了編程上的方便,需要將幾個按鈕都要用到的功能寫成下面兩個方法供其他方法調用:////設置文本框的讀寫protectedvoidsetTextState(booleanflag){for(inti=0;i< }protectedvoidfor(inti=0;i< }protectedprotectedvoidfalse);returnreturn}if(rs.first()){//移動游標到第一條位置showDate()顯示當前記錄到界面上curRow=1;//記錄游標的新位置}}protectedprotectedvoidif(curRow<=1){ return} //向前移動 /

溫馨提示

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

評論

0/150

提交評論