Java程序設計-第12章 數(shù)據(jù)庫編程_第1頁
Java程序設計-第12章 數(shù)據(jù)庫編程_第2頁
Java程序設計-第12章 數(shù)據(jù)庫編程_第3頁
Java程序設計-第12章 數(shù)據(jù)庫編程_第4頁
Java程序設計-第12章 數(shù)據(jù)庫編程_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十二章數(shù)據(jù)庫編程圖形圖像研究所計算機科學與技術、軟件學院

浙江工業(yè)大學高飛,陸佳煒等。Java程序設計實用教程。北京:清華大學出版社,2013(ISBN:978-7-302-31695-4)高飛,趙小敏等。Java程序設計實用教程習題集。北京:清華大學出版社,2013(ISBN:978-7-302-32051-7)高飛教授,博士生導師

Tel.RL:http://前言本章的目的:本章在介紹數(shù)據(jù)庫的概念、SQL語言、JDBC以及SQLServer數(shù)據(jù)庫的基礎上,通過數(shù)據(jù)庫操作例子,向讀者介紹Java中使用JDBC訪問數(shù)據(jù)庫編程方法?;仡欔P鍵詞:網(wǎng)絡編程的兩個重要問題(找到主機、找到進程)、URL、Socket、IntelAddress小節(jié)安排數(shù)據(jù)庫編程12.3.1JDBC驅動程序設置12.1JDBC概述12.2JDBCAPI12.3.2建立數(shù)據(jù)庫連接12.3.3查詢記錄12.3JDBC編程實例12.1.1JDBC模型12.1.2JDBC驅動方式12.3.4刪除記錄12.3.5修改記錄12.3.6數(shù)據(jù)庫操作綜合實例12.3.7SQL數(shù)據(jù)庫常用命令12.1JDBC概述JDBC是Java數(shù)據(jù)庫連接技術的簡稱,提供連接各種常用數(shù)據(jù)庫的能力12.1.1JDBC模型Java程序JavaAPIJDBC實現(xiàn)ConnectionStatementPreparedStatementResultSetOracleMySqlSQLServerJAVA程序一般通過調(diào)用JDBC所定義的類和接口來處理數(shù)據(jù)庫中的數(shù)據(jù),也就是通過調(diào)用JDBC的驅動程序實現(xiàn)對數(shù)據(jù)庫的操作。12.1.1JDBC模型基于JDBC的數(shù)據(jù)庫程序設計方法通過三步組成。首先是連接數(shù)據(jù)庫然后是執(zhí)行SQL(StructureQueryLanguage,結構化查詢語言)語句并處理查詢結果最后是關閉連接通過執(zhí)行SQL語句可以處理數(shù)據(jù)庫數(shù)據(jù),比如對數(shù)據(jù)庫中的記錄進行添加、刪除、修改等操作,或者查詢滿足某種條件的數(shù)據(jù)等12.1.2JDBC驅動方式JDBC驅動程序有下列4種:JDBC-ODBC橋加ODBC驅動程序本地API結合Java驅動程序網(wǎng)絡純Java驅動程序本地協(xié)議純Java驅動程序12.1.2JDBC驅動方式JDBC-ODBC橋加ODBC驅動程序JDBC-ODBC橋產(chǎn)品利用ODBC驅動程序提供JDBC訪問。在服務器上必須可以安裝ODBC驅動程序。JDBC-ODBC橋是一個JDBC驅動程序,它通過將JDBC操作轉換為ODBC操作來實現(xiàn)JDBC操作。JAVA應用系統(tǒng)JDBCAPIJDBC-ODBC橋DBMSODBC層ODBCAPI12.1.2JDBC驅動方式本地API結合Java驅動程序本地APIJava驅動程序通過JDBC驅動程序將應用程序中的調(diào)用請求轉化為本地API調(diào)用,由本地API與數(shù)據(jù)庫通信,數(shù)據(jù)庫處理完請求將結果通過本地API返回,進而返回給JDBC驅動程序,JDBC驅動程序將返回的結果轉化為JDBC標準形式,再返回給客戶程序JAVA應用系統(tǒng)JDBCAPIJDBC驅動程序DBMS本地API(廠商提供)12.1.2JDBC驅動方式網(wǎng)絡純Java驅動程序這種驅動程序將JDBC轉換為與DBMS無關的網(wǎng)絡協(xié)議,之后這種協(xié)議又被某個服務器轉換為一種DBMS協(xié)議。JAVA應用系統(tǒng)JDBCAPIJDBC驅動程序本地驅動程序應用服務器DBMS12.1.2JDBC驅動方式本地協(xié)議純Java驅動程序驅動程序將JDBC調(diào)用直接轉換為DBMS所使用的網(wǎng)絡協(xié)議。這種驅動與數(shù)據(jù)庫建立直接的套接字連接,采用具體數(shù)據(jù)庫廠商的網(wǎng)絡協(xié)議把JDBCAPI調(diào)用轉換為直接網(wǎng)絡調(diào)用,也就是允許從客戶機機器上直接調(diào)用DBMS服務器,是Intranet訪問的一個很實用的解決方法。JAVA應用系統(tǒng)JDBCAPIJDBC驅動程序DBMS建議盡可能地使用純JavaJDBC驅動程序代替橋和ODBC驅動程序,這可以完全省去ODBC所需的客戶機配置,也免除了被其它插件錯誤影響數(shù)據(jù)庫連接的可能性。12.2JDBCAPIJDBC向應用程序開發(fā)者提供獨立于某種數(shù)據(jù)庫的統(tǒng)一的API。JDBCAPI是一系列抽象的接口,它使得應用程序員能夠進行數(shù)據(jù)庫連接,執(zhí)行SQL聲明,并且返回結果。數(shù)據(jù)源(javax.sql.DataSource)數(shù)據(jù)庫連接(java.sql.Connection)SQL語句執(zhí)行器(java.sql.Statement)SQL查詢結果集(java.sql.ResultSet)12.2JDBCAPIjavax.sql.DataSource

表12-1javax.sql.DataSource的常用方法方法說明ConnectiongetConnection()嘗試建立到該對象所代表的數(shù)據(jù)源的數(shù)據(jù)庫連接ConnectiongetConnection(String

username,Stringpassword)嘗試建立到該對象所代表的數(shù)據(jù)源的數(shù)據(jù)庫連接int

getLoginTimeout()獲取登錄超時時間PrintWriter

getLogWriter()獲取日志打印流voidsetLoginTimeout(intseconds)設定登錄超時voidsetLogWriter(PrintWriterout)設定日志打印流voidsetServerName(String

ip)指定數(shù)據(jù)庫服務器IP地址voidsetDatabaseName(String

databaseName)指定要使用的數(shù)據(jù)庫名稱12.2JDBCAPIjava.sql.Connection

java.sql.Connection接口代表與特定數(shù)據(jù)庫的連接,在接連的上下文中可以執(zhí)行SQL語句并返回結果

表12-2java.sql.Connection的常用方法方法說明StatementcreateStatement()創(chuàng)建SQL語句執(zhí)行器PreparedStatement

prepareStatement(String

sql)創(chuàng)建預編譯的SQL語句執(zhí)行器CallableStatement

prepareCall(String

sql)創(chuàng)建訪問存儲過程的SQL語句執(zhí)行器DatabaseMetaData

getMetaData()獲取數(shù)據(jù)庫元數(shù)據(jù)voidclose()關閉數(shù)據(jù)庫連接12.2JDBCAPIjava.sql.Statement

SQL語句執(zhí)行器對應于接口java.sql.Statement

的實例對象。通過SQL語句執(zhí)行器可以執(zhí)行各種SQL語句。表12-3java.sql.Statement的常用方法方法說明boolean

execute(String

sql)執(zhí)行SQL語句ResultSet

executeQuery(String

sql)執(zhí)行SQL查詢語句int

executeUpdate(String

sql)執(zhí)行INSERT,DELETE或UPDATE類型的SQL語句ResultSet

getResultSet()若用execute方法執(zhí)行了SELECT類的SQL語句,可以通過該方法獲得執(zhí)行該SQL語句返回的結果集voidclose()關閉SQL語句執(zhí)行器12.2JDBCAPIjava.sql.ResultSetSQL查詢結果集對應于接口java.sql.ResultSet

的實例對象。接口java.sql.ResultSet

的實例對象不僅記錄了查詢集結果中的每行數(shù)據(jù),同時也記錄了各列的類型信息。表12-4java.sql.ResultSet的常用方法方法說明XXXgetXXX()這里XXX表示各種數(shù)據(jù)類型,如String、int等,該方法獲取類型為XXX的數(shù)據(jù)XXXupdateXXX()這里XXX表示各種數(shù)據(jù)類型,該方法更新類型為XXX的數(shù)據(jù)voidupdateRow()將ResultSet

中被更新過的行提交給數(shù)據(jù)庫,更新數(shù)據(jù)庫中對應的行voiddeleteRow()刪除ResultSet

中當前行,并更新數(shù)據(jù)庫12.2JDBCAPIvoidinsertRow()將ResultSet內(nèi)部的緩沖區(qū)行插入到數(shù)據(jù)庫中voidbeforeFirst()讓指針指向第一行的前面voidafterLast()讓指針指向最后一行的后面booleannext()讓指針移動到下一行booleanprevious()讓指針移動到前一行boolean

absolute(introw)讓指針移動到第row行boolean

relative(introws)讓指針相對于當前行移動rows行voidclose()關閉結果集12.3JDBC編程實例1.MicrosoftSQLServer2000JDBC驅動安裝首先安裝SQLServer2000。首先下載SQLServer2000DriverforJDBCServicePack3,這個補丁是支持JDK1.4的。下載網(wǎng)址:http:///downloads/details.aspx?FamilyID=07287b11-0502-461a-b138-2aa54bfdc03a&displaylang=en執(zhí)行setup.exe安裝SQLServerJDBC驅動程序。在安裝目錄下有幫助文件,安裝過程請參閱幫助文件。在Eclipse安裝目錄,例如D:/JAVA/Eclipse/eclipse下創(chuàng)建路徑:D:\eclipse\jdbc\SQLServerJDBC\lib。將setup.exe安裝的下面3個java歸檔文件放入其中:msbase.jar、mssqlserver.jar、msutil.jar12.3.1JDBC驅動程序設置(以SQLServer2000為例)12.3JDBC編程實例1)新建數(shù)據(jù)庫2)創(chuàng)建數(shù)據(jù)庫用戶12.3JDBC編程實例3)在eclipse中新建項目4)在項目中添加JDBC驅動12.3JDBC編程實例5)注冊驅動程序MicrosoftSQLServer2000JDBC驅動程序的名稱:com.microsoft.jdbc.sqlserver.SQLServerDriver

下面的代碼示例演示如何注冊驅動程序:Driverd=(Driver)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();12.3JDBC編程實例6)傳遞連接URLConnectioncon=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;databaseName=test;","userName","password");“l(fā)ocalhost”是服務器名稱值,可以是IP地址或主機名(假定您的網(wǎng)絡可以將主機名解析為IP地址),本地主機就可以直接使用“l(fā)ocalhost”來代替服務器地址。“1433”數(shù)字值是數(shù)據(jù)庫偵聽的端口號。MicrosoftSQLServer2000默認數(shù)據(jù)庫偵聽的端口號是“1433”,如果數(shù)據(jù)庫修改過端口號,就需要把“1433”修改為實際的端口號?!癲atabaseName”是連接的數(shù)據(jù)庫名?!皍serName”是數(shù)據(jù)庫訪問的用戶名。“password”是數(shù)據(jù)庫訪問用戶名對應的登錄密碼。12.3JDBC編程實例7)測試數(shù)據(jù)連接代碼

//注冊SQLServerJDBC驅動程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//創(chuàng)建新數(shù)據(jù)庫連接Connectioncon=java.sql.DriverManager.getConnection(“http://localhost:1433databaseName=jdbctest;selectMethod=cursor;”,userName,password);……java.sql.DatabaseMetaDatadm=con.getMetaData();System.out.println("/t驅動器名字:"+dm.getDriverName());System.out.println("/t驅動器版本:"+dm.getDriverVersion());12.3JDBC編程實例8)常見問題

數(shù)據(jù)庫連接無法連接,出現(xiàn)出錯信息,有可能是以下原因引起數(shù)據(jù)庫服務管理器未啟動安裝SQLServer的驗證模式設置需要為“混合模式”,該模式既允許Windows驗證,也允許SQLServer驗證。驅動程序版本不支持MicrosoftSQLServer2000防火墻禁止了對數(shù)據(jù)庫端口的連接12.3.3添加記錄表12-1數(shù)據(jù)庫SQL類型與JAVAObject的映射SQL類型JavaObject類型CHAR,VARCHAR,LONGVARCHARStringNUMERICjava.sql.NumericTINYINT,SMALLINT,INTEGERIntegerBITBooleanBIGINTLongREALFloatFLOAT,DOUBLEDoubleBINARY,VARBINARY,LONGVARBINARYByteTIMEjava.sql.TimeDATEjava.sql.DateTIMESTAMPjava.sql.TimStamp12.3.3添加記錄1)新建表

student12.3.3添加記錄2)添加記錄Connectioncon=this.getConnection();//創(chuàng)建一個數(shù)據(jù)庫連接Statements=con.createStatement();//創(chuàng)建一個數(shù)據(jù)庫會話對象s.executeUpdate("insertintostudent(id,name,birthday,Email)values('1201','王新','1990/12/1','wangxin@163.com')");……System.out.println("給數(shù)據(jù)庫表student添加學生數(shù)據(jù)完成!");s.close();//關閉數(shù)據(jù)庫會話對象con.close();//關閉數(shù)據(jù)庫連接con=null;SQL語句:insertinto表名(字段名1,…,字段名n)values(值1,…,值n)12.3.4查詢記錄3)查詢記錄SQL語句:ResultSet

rs=s.executeQuery("selectcount(*)fromstudent");

intcount=rs.getInt(1);//讀取數(shù)據(jù)總數(shù)ResultSet

rs=s.executeQuery(“select*fromstudentorderbyidasc”);//讀取所有字段Stringname=rs.getString(“name”);//讀取其中的name字段根據(jù)查詢條件讀取指定字段,并根據(jù)某字段排序select字段名1,…,字段名nfrom表名where字段名1=值1,…,字段名n=值norderby字段名asc12.3.4查詢記錄如查詢高一(2)班所有學生的名字:selectnamefromstudentwhereclassname=‘高一(2)班’byidascResultSet

rs=s.executeQuery("select*fromstudentorderbyidasc");while(rs.next()){//遍歷查詢結果集

Stringid=rs.getString("id"); Stringname=rs.getString("name"); Stringbirthday=rs.getString("birthday"); StringEmail=rs.getString("Email");

System.out.println("編號:"+id+"\t姓名:“

+name+"\t出生年月:"+birthday+"\t郵箱:"+Email);}12.3.5刪除記錄SQL語句Statements=con.createStatement();s.executeUpdate("deletefrom表名where字段名1=值1");如:s.executeUpdate(“deletefromstudentwhereclassname=‘高一(1)班’");12.3.6修改記錄SQL語句Statements=con.createStatement();s.executeUpdate("update表名set字段名1=值1,…,字段名n=值nwhere字段名1=值1");如修改id為1201的學生姓名為‘王國強’:s.executeUpdate("updatestudentsetname='王國強'whereid='1201'");12.3.7SQL數(shù)據(jù)庫常用命令1.數(shù)據(jù)記錄篩選

//準確查詢sql="select*from數(shù)據(jù)表where字段名=字段值orderby

字段名[desc]"http://模糊查詢,%:代表任意長的一段字符,_:代表一個字符sql="select*from數(shù)據(jù)表where字段名like'%字段值%'orderby

字段名[desc]"http://根據(jù)排序條件讀取前10條查詢記錄sql="selecttop10*from數(shù)據(jù)表where字段名orderby

字段名[desc]"http://根據(jù)值的范圍查詢,(a,b,c,d):a、b、c、d中的任意一個,(^a,b,c,d):不在a、b、c、d中的任意一個sql="select*from數(shù)據(jù)表where字段名in('值1','值2','值3')"http://根據(jù)值的起止范圍查詢sql="select*from數(shù)據(jù)表where字段名between值1and值2"http://Distinct函數(shù),查詢數(shù)據(jù)表內(nèi)指定字段不重復的記錄sql="selectDistinct字段名from數(shù)據(jù)表"12.3.7SQL數(shù)據(jù)庫常用命令2.更新數(shù)據(jù)記錄

//更新一個字段sql="update數(shù)據(jù)表set字段名=字段值where條件表達式"http://更新多個字段sql="update數(shù)據(jù)表set字段1=值1,字段2=值2……字段n=值nwhere條件表達式"

3.刪除數(shù)據(jù)記錄

//刪除符合條件表達式的數(shù)據(jù)記錄sql="deletefrom數(shù)據(jù)表where條件表達式"http://將數(shù)據(jù)表所有記錄刪除sql="deletefrom數(shù)據(jù)表"

12.3.7SQL數(shù)據(jù)庫常用命令4.添加數(shù)據(jù)記錄

//添加一條記錄sql="insertinto數(shù)據(jù)表(字段1,字段2,字段3…)values(值1,值2,值3…)"http://把源

溫馨提示

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

評論

0/150

提交評論