版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第十二章數(shù)據(jù)庫編程圖形圖像研究所計(jì)算機(jī)科學(xué)與技術(shù)、軟件學(xué)院
浙江工業(yè)大學(xué)高飛,陸佳煒等。Java程序設(shè)計(jì)實(shí)用教程。北京:清華大學(xué)出版社,2013(ISBN:978-7-302-31695-4)高飛,趙小敏等。Java程序設(shè)計(jì)實(shí)用教程習(xí)題集。北京:清華大學(xué)出版社,2013(ISBN:978-7-302-32051-7)高飛教授,博士生導(dǎo)師
Tel.RL:http://前言本章的目的:本章在介紹數(shù)據(jù)庫的概念、SQL語言、JDBC以及SQLServer數(shù)據(jù)庫的基礎(chǔ)上,通過數(shù)據(jù)庫操作例子,向讀者介紹Java中使用JDBC訪問數(shù)據(jù)庫編程方法?;仡欔P(guān)鍵詞:網(wǎng)絡(luò)編程的兩個(gè)重要問題(找到主機(jī)、找到進(jìn)程)、URL、Socket、IntelAddress小節(jié)安排數(shù)據(jù)庫編程12.3.1JDBC驅(qū)動(dòng)程序設(shè)置12.1JDBC概述12.2JDBCAPI12.3.2建立數(shù)據(jù)庫連接12.3.3查詢記錄12.3JDBC編程實(shí)例12.1.1JDBC模型12.1.2JDBC驅(qū)動(dòng)方式12.3.4刪除記錄12.3.5修改記錄12.3.6數(shù)據(jù)庫操作綜合實(shí)例12.3.7SQL數(shù)據(jù)庫常用命令12.1JDBC概述JDBC是Java數(shù)據(jù)庫連接技術(shù)的簡稱,提供連接各種常用數(shù)據(jù)庫的能力12.1.1JDBC模型Java程序JavaAPIJDBC實(shí)現(xiàn)ConnectionStatementPreparedStatementResultSetOracleMySqlSQLServerJAVA程序一般通過調(diào)用JDBC所定義的類和接口來處理數(shù)據(jù)庫中的數(shù)據(jù),也就是通過調(diào)用JDBC的驅(qū)動(dòng)程序?qū)崿F(xiàn)對(duì)數(shù)據(jù)庫的操作。12.1.1JDBC模型基于JDBC的數(shù)據(jù)庫程序設(shè)計(jì)方法通過三步組成。首先是連接數(shù)據(jù)庫然后是執(zhí)行SQL(StructureQueryLanguage,結(jié)構(gòu)化查詢語言)語句并處理查詢結(jié)果最后是關(guān)閉連接通過執(zhí)行SQL語句可以處理數(shù)據(jù)庫數(shù)據(jù),比如對(duì)數(shù)據(jù)庫中的記錄進(jìn)行添加、刪除、修改等操作,或者查詢滿足某種條件的數(shù)據(jù)等12.1.2JDBC驅(qū)動(dòng)方式JDBC驅(qū)動(dòng)程序有下列4種:JDBC-ODBC橋加ODBC驅(qū)動(dòng)程序本地API結(jié)合Java驅(qū)動(dòng)程序網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序本地協(xié)議純Java驅(qū)動(dòng)程序12.1.2JDBC驅(qū)動(dòng)方式JDBC-ODBC橋加ODBC驅(qū)動(dòng)程序JDBC-ODBC橋產(chǎn)品利用ODBC驅(qū)動(dòng)程序提供JDBC訪問。在服務(wù)器上必須可以安裝ODBC驅(qū)動(dòng)程序。JDBC-ODBC橋是一個(gè)JDBC驅(qū)動(dòng)程序,它通過將JDBC操作轉(zhuǎn)換為ODBC操作來實(shí)現(xiàn)JDBC操作。JAVA應(yīng)用系統(tǒng)JDBCAPIJDBC-ODBC橋DBMSODBC層ODBCAPI12.1.2JDBC驅(qū)動(dòng)方式本地API結(jié)合Java驅(qū)動(dòng)程序本地APIJava驅(qū)動(dòng)程序通過JDBC驅(qū)動(dòng)程序?qū)?yīng)用程序中的調(diào)用請(qǐng)求轉(zhuǎn)化為本地API調(diào)用,由本地API與數(shù)據(jù)庫通信,數(shù)據(jù)庫處理完請(qǐng)求將結(jié)果通過本地API返回,進(jìn)而返回給JDBC驅(qū)動(dòng)程序,JDBC驅(qū)動(dòng)程序?qū)⒎祷氐慕Y(jié)果轉(zhuǎn)化為JDBC標(biāo)準(zhǔn)形式,再返回給客戶程序JAVA應(yīng)用系統(tǒng)JDBCAPIJDBC驅(qū)動(dòng)程序DBMS本地API(廠商提供)12.1.2JDBC驅(qū)動(dòng)方式網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序這種驅(qū)動(dòng)程序?qū)DBC轉(zhuǎn)換為與DBMS無關(guān)的網(wǎng)絡(luò)協(xié)議,之后這種協(xié)議又被某個(gè)服務(wù)器轉(zhuǎn)換為一種DBMS協(xié)議。JAVA應(yīng)用系統(tǒng)JDBCAPIJDBC驅(qū)動(dòng)程序本地驅(qū)動(dòng)程序應(yīng)用服務(wù)器DBMS12.1.2JDBC驅(qū)動(dòng)方式本地協(xié)議純Java驅(qū)動(dòng)程序驅(qū)動(dòng)程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這種驅(qū)動(dòng)與數(shù)據(jù)庫建立直接的套接字連接,采用具體數(shù)據(jù)庫廠商的網(wǎng)絡(luò)協(xié)議把JDBCAPI調(diào)用轉(zhuǎn)換為直接網(wǎng)絡(luò)調(diào)用,也就是允許從客戶機(jī)機(jī)器上直接調(diào)用DBMS服務(wù)器,是Intranet訪問的一個(gè)很實(shí)用的解決方法。JAVA應(yīng)用系統(tǒng)JDBCAPIJDBC驅(qū)動(dòng)程序DBMS建議盡可能地使用純JavaJDBC驅(qū)動(dòng)程序代替橋和ODBC驅(qū)動(dòng)程序,這可以完全省去ODBC所需的客戶機(jī)配置,也免除了被其它插件錯(cuò)誤影響數(shù)據(jù)庫連接的可能性。12.2JDBCAPIJDBC向應(yīng)用程序開發(fā)者提供獨(dú)立于某種數(shù)據(jù)庫的統(tǒng)一的API。JDBCAPI是一系列抽象的接口,它使得應(yīng)用程序員能夠進(jìn)行數(shù)據(jù)庫連接,執(zhí)行SQL聲明,并且返回結(jié)果。數(shù)據(jù)源(javax.sql.DataSource)數(shù)據(jù)庫連接(java.sql.Connection)SQL語句執(zhí)行器(java.sql.Statement)SQL查詢結(jié)果集(java.sql.ResultSet)12.2JDBCAPIjavax.sql.DataSource
表12-1javax.sql.DataSource的常用方法方法說明ConnectiongetConnection()嘗試建立到該對(duì)象所代表的數(shù)據(jù)源的數(shù)據(jù)庫連接ConnectiongetConnection(String
username,Stringpassword)嘗試建立到該對(duì)象所代表的數(shù)據(jù)源的數(shù)據(jù)庫連接int
getLoginTimeout()獲取登錄超時(shí)時(shí)間PrintWriter
getLogWriter()獲取日志打印流voidsetLoginTimeout(intseconds)設(shè)定登錄超時(shí)voidsetLogWriter(PrintWriterout)設(shè)定日志打印流voidsetServerName(String
ip)指定數(shù)據(jù)庫服務(wù)器IP地址voidsetDatabaseName(String
databaseName)指定要使用的數(shù)據(jù)庫名稱12.2JDBCAPIjava.sql.Connection
java.sql.Connection接口代表與特定數(shù)據(jù)庫的連接,在接連的上下文中可以執(zhí)行SQL語句并返回結(jié)果
表12-2java.sql.Connection的常用方法方法說明StatementcreateStatement()創(chuàng)建SQL語句執(zhí)行器PreparedStatement
prepareStatement(String
sql)創(chuàng)建預(yù)編譯的SQL語句執(zhí)行器CallableStatement
prepareCall(String
sql)創(chuàng)建訪問存儲(chǔ)過程的SQL語句執(zhí)行器DatabaseMetaData
getMetaData()獲取數(shù)據(jù)庫元數(shù)據(jù)voidclose()關(guān)閉數(shù)據(jù)庫連接12.2JDBCAPIjava.sql.Statement
SQL語句執(zhí)行器對(duì)應(yīng)于接口java.sql.Statement
的實(shí)例對(duì)象。通過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語句返回的結(jié)果集voidclose()關(guān)閉SQL語句執(zhí)行器12.2JDBCAPIjava.sql.ResultSetSQL查詢結(jié)果集對(duì)應(yīng)于接口java.sql.ResultSet
的實(shí)例對(duì)象。接口java.sql.ResultSet
的實(shí)例對(duì)象不僅記錄了查詢集結(jié)果中的每行數(shù)據(jù),同時(shí)也記錄了各列的類型信息。表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ù)庫中對(duì)應(yīng)的行voiddeleteRow()刪除ResultSet
中當(dāng)前行,并更新數(shù)據(jù)庫12.2JDBCAPIvoidinsertRow()將ResultSet內(nèi)部的緩沖區(qū)行插入到數(shù)據(jù)庫中voidbeforeFirst()讓指針指向第一行的前面voidafterLast()讓指針指向最后一行的后面booleannext()讓指針移動(dòng)到下一行booleanprevious()讓指針移動(dòng)到前一行boolean
absolute(introw)讓指針移動(dòng)到第row行boolean
relative(introws)讓指針相對(duì)于當(dāng)前行移動(dòng)rows行voidclose()關(guān)閉結(jié)果集12.3JDBC編程實(shí)例1.MicrosoftSQLServer2000JDBC驅(qū)動(dòng)安裝首先安裝SQLServer2000。首先下載SQLServer2000DriverforJDBCServicePack3,這個(gè)補(bǔ)丁是支持JDK1.4的。下載網(wǎng)址:http:///downloads/details.aspx?FamilyID=07287b11-0502-461a-b138-2aa54bfdc03a&displaylang=en執(zhí)行setup.exe安裝SQLServerJDBC驅(qū)動(dòng)程序。在安裝目錄下有幫助文件,安裝過程請(qǐng)參閱幫助文件。在Eclipse安裝目錄,例如D:/JAVA/Eclipse/eclipse下創(chuàng)建路徑:D:\eclipse\jdbc\SQLServerJDBC\lib。將setup.exe安裝的下面3個(gè)java歸檔文件放入其中:msbase.jar、mssqlserver.jar、msutil.jar12.3.1JDBC驅(qū)動(dòng)程序設(shè)置(以SQLServer2000為例)12.3JDBC編程實(shí)例1)新建數(shù)據(jù)庫2)創(chuàng)建數(shù)據(jù)庫用戶12.3JDBC編程實(shí)例3)在eclipse中新建項(xiàng)目4)在項(xiàng)目中添加JDBC驅(qū)動(dòng)12.3JDBC編程實(shí)例5)注冊(cè)驅(qū)動(dòng)程序MicrosoftSQLServer2000JDBC驅(qū)動(dòng)程序的名稱:com.microsoft.jdbc.sqlserver.SQLServerDriver
下面的代碼示例演示如何注冊(cè)驅(qū)動(dòng)程序:Driverd=(Driver)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();12.3JDBC編程實(shí)例6)傳遞連接URLConnectioncon=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;databaseName=test;","userName","password");“l(fā)ocalhost”是服務(wù)器名稱值,可以是IP地址或主機(jī)名(假定您的網(wǎng)絡(luò)可以將主機(jī)名解析為IP地址),本地主機(jī)就可以直接使用“l(fā)ocalhost”來代替服務(wù)器地址。“1433”數(shù)字值是數(shù)據(jù)庫偵聽的端口號(hào)。MicrosoftSQLServer2000默認(rèn)數(shù)據(jù)庫偵聽的端口號(hào)是“1433”,如果數(shù)據(jù)庫修改過端口號(hào),就需要把“1433”修改為實(shí)際的端口號(hào)?!癲atabaseName”是連接的數(shù)據(jù)庫名?!皍serName”是數(shù)據(jù)庫訪問的用戶名?!皃assword”是數(shù)據(jù)庫訪問用戶名對(duì)應(yīng)的登錄密碼。12.3JDBC編程實(shí)例7)測(cè)試數(shù)據(jù)連接代碼
//注冊(cè)SQLServerJDBC驅(qū)動(dòng)程序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驅(qū)動(dòng)器名字:"+dm.getDriverName());System.out.println("/t驅(qū)動(dòng)器版本:"+dm.getDriverVersion());12.3JDBC編程實(shí)例8)常見問題
數(shù)據(jù)庫連接無法連接,出現(xiàn)出錯(cuò)信息,有可能是以下原因引起數(shù)據(jù)庫服務(wù)管理器未啟動(dòng)安裝SQLServer的驗(yàn)證模式設(shè)置需要為“混合模式”,該模式既允許Windows驗(yàn)證,也允許SQLServer驗(yàn)證。驅(qū)動(dòng)程序版本不支持MicrosoftSQLServer2000防火墻禁止了對(duì)數(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)建一個(gè)數(shù)據(jù)庫連接Statements=con.createStatement();//創(chuàng)建一個(gè)數(shù)據(jù)庫會(huì)話對(duì)象s.executeUpdate("insertintostudent(id,name,birthday,Email)values('1201','王新','1990/12/1','wangxin@163.com')");……System.out.println("給數(shù)據(jù)庫表student添加學(xué)生數(shù)據(jù)完成!");s.close();//關(guān)閉數(shù)據(jù)庫會(huì)話對(duì)象con.close();//關(guān)閉數(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)班所有學(xué)生的名字:selectnamefromstudentwhereclassname=‘高一(2)班’byidascResultSet
rs=s.executeQuery("select*fromstudentorderbyidasc");while(rs.next()){//遍歷查詢結(jié)果集
Stringid=rs.getString("id"); Stringname=rs.getString("name"); Stringbirthday=rs.getString("birthday"); StringEmail=rs.getString("Email");
System.out.println("編號(hào):"+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的學(xué)生姓名為‘王國強(qiáng)’:s.executeUpdate("updatestudentsetname='王國強(qiáng)'whereid='1201'");12.3.7SQL數(shù)據(jù)庫常用命令1.數(shù)據(jù)記錄篩選
//準(zhǔn)確查詢sql="select*from數(shù)據(jù)表where字段名=字段值orderby
字段名[desc]"http://模糊查詢,%:代表任意長的一段字符,_:代表一個(gè)字符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中的任意一個(gè),(^a,b,c,d):不在a、b、c、d中的任意一個(gè)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)指定字段不重復(fù)的記錄sql="selectDistinct字段名from數(shù)據(jù)表"12.3.7SQL數(shù)據(jù)庫常用命令2.更新數(shù)據(jù)記錄
//更新一個(gè)字段sql="update數(shù)據(jù)表set字段名=字段值where條件表達(dá)式"http://更新多個(gè)字段sql="update數(shù)據(jù)表set字段1=值1,字段2=值2……字段n=值nwhere條件表達(dá)式"
3.刪除數(shù)據(jù)記錄
//刪除符合條件表達(dá)式的數(shù)據(jù)記錄sql="deletefrom數(shù)據(jù)表where條件表達(dá)式"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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年短期貸款協(xié)議模板
- 部編版語文八年級(jí)上冊(cè)古詩詞文學(xué)賞析 素材 3 課外古詩詞誦讀
- 2021-2026年中國互聯(lián)網(wǎng)+醫(yī)療器械行業(yè)市場(chǎng)運(yùn)營現(xiàn)狀及投資戰(zhàn)略咨詢報(bào)告
- 2024石材外貿(mào)代理與出口合作合同3篇
- 2025至2031年中國菜蟲一掃光乳油行業(yè)投資前景及策略咨詢研究報(bào)告
- 房屋租賃合同糾紛和解協(xié)議書模板
- 電子商務(wù)授權(quán)運(yùn)營協(xié)議書模板
- 2024有子女離婚協(xié)議中子女教育金及生活費(fèi)用保障范本3篇
- 2025至2031年中國電子式安全帽報(bào)警器行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國球磨襯板行業(yè)投資前景及策略咨詢研究報(bào)告
- (正式版)SH∕T 3541-2024 石油化工泵組施工及驗(yàn)收規(guī)范
- 學(xué)校幼兒園食堂從業(yè)人員考試試題
- 2024年青海交通職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測(cè)試題庫附答案
- 安全管理制度執(zhí)行情況
- (高清版)JTG 2232-2019 公路隧道抗震設(shè)計(jì)規(guī)范
- DZ∕T 0173-2022 大地電磁測(cè)深法技術(shù)規(guī)程(正式版)
- 二年級(jí)下冊(cè)數(shù)學(xué)口算題天天練帶答案
- 2023年春外研版四年級(jí)英語下冊(cè)全冊(cè)完整課件
- 《現(xiàn)行制度下高新技術(shù)企業(yè)的稅收籌劃-以華為為例》
- MOOC 中國天氣-南京信息工程大學(xué) 中國大學(xué)慕課答案
- 2021-2022學(xué)年浙江省紹興市上虞區(qū)人教版四年級(jí)上冊(cè)期末質(zhì)量評(píng)估數(shù)學(xué)試卷
評(píng)論
0/150
提交評(píng)論