




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
王紅第4章JSP中使用數(shù)據(jù)庫
2023/11/301主要內(nèi)容第4章JSP中使用數(shù)據(jù)庫4.1JDBC技術(shù)概述4.2使用JDBC4.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫4.4在JSP中通過本地協(xié)議純JAVA方式使用數(shù)據(jù)庫4.5共享數(shù)據(jù)庫連接4.6成績錄入查詢系統(tǒng)
2023/11/302目標(biāo)JDBC的概念
JDBC的使用在JSP中使用數(shù)據(jù)庫
2023/11/3034.1JDBC技術(shù)概述4.1.1什么是JDBC
JDBC是一種用于執(zhí)行SQL語句的JavaAPI。由一組用Java編程語言編寫的類和接口組成。由java.sql.*和javax.sql.*兩個(gè)包中的一些類和接口組成。為數(shù)據(jù)庫開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,使他們能夠用純JavaAPI來編寫數(shù)據(jù)庫應(yīng)用程序。將Java和JDBC結(jié)合起來將使程序員只須寫一遍程序就可讓它可向任何數(shù)據(jù)庫發(fā)送SQL語句,可在任何平臺(tái)上運(yùn)行。2023/11/3044.1.1什么是JDBC特性不限制傳遞到底層DBMS驅(qū)動(dòng)程序的查詢類型JDBC機(jī)制易于理解和使用提供與Java系統(tǒng)的其他部分保持一致的Java接口JDBC可以在常見SQL層API的頂層實(shí)現(xiàn)2023/11/3054.1.2JDBC的用途JDBC是一個(gè)緊湊、簡單的軟件層JDBC即是個(gè)低級(jí)接口又是一個(gè)高級(jí)接口,高級(jí)接口使用的是一種更易理解和更為方便的API,這種API在幕后被轉(zhuǎn)換為諸如JDBC這樣的低級(jí)接口JDBCAPI定義應(yīng)用程序如何:打開連接與數(shù)據(jù)庫通信執(zhí)行SQL語句檢索查詢結(jié)果2023/11/3064.1.2JDBC的用途如下所示://建立與數(shù)據(jù)庫的連接Connectioncon=DriverManager.getConnection("jdbc:odbc:wombat","login","password");//發(fā)送語句Statementstmt=con.createStatement();ResultSet
rs=stmt.executeQuery("SELECTa,b,cFROMTable1");//下面循環(huán)處理結(jié)果
while(rs.next())
System.out.println(rs.getString("a")+""+rs.getString("b")+""+rs.getString("c"));2023/11/3074.1.3JDBC與ODBC和其它API的比較Java可以使用ODBC,但最好是在JDBC的幫助下以JDBC-ODBC橋的形式使用ODBC不適合直接在Java中使用,因?yàn)樗褂肅語言接口從ODBCAPI按字面翻譯到JavaAPI是不可取的ODBC很難學(xué)。它把簡單和高級(jí)功能混在一起,而且即使對(duì)于簡單的查詢,其選項(xiàng)也極為復(fù)雜。相反,JDBC盡量保證簡單功能的簡便性,而同時(shí)在必要時(shí)允許使用高級(jí)功能2023/11/3084.1.3JDBC與ODBC和其它API的比較完全用Java編寫JDBC驅(qū)動(dòng)程序則JDBC代碼在所有Java平臺(tái)上都可以自動(dòng)安裝、移植并保證安全性JDBC建立在ODBC上而不是從零開始JDBC保留了ODBC的基本設(shè)計(jì)特征兩種接口都基于X/OpenSQLCLI(調(diào)用級(jí)接口)它們之間最大的區(qū)別在于:JDBC以Java風(fēng)格與優(yōu)點(diǎn)為基礎(chǔ)并進(jìn)行優(yōu)化2023/11/3094.1.4兩層模型和三層模型JDBC支持兩種模型:二層模型Javaapplet/應(yīng)用程序直接與數(shù)據(jù)庫交互被稱為客戶端/服務(wù)器配置如圖4-1所示三層模型使用中間層可以在不同語言中實(shí)現(xiàn)中間層如圖4-2所示2023/11/30104.1.4兩層模型和三層模型2023/11/30114.1.5SQL的一致性雖然大多數(shù)的DBMS對(duì)其基本功能都使用了標(biāo)準(zhǔn)形式的SQL,但它們卻不完全符合標(biāo)準(zhǔn)SQL語法或語義JDBC在類Java.SQL.Types類中定義了一組通用SQL類型標(biāo)識(shí)符,如下的類型表示不同數(shù)據(jù)庫中的實(shí)數(shù):staticintDOUBLEstaticintFLOATstaticintNUMERICstaticintREAL2023/11/30124.1.5SQL的一致性JDBC處理SQL一致性問題方法:JDBCAPI允許將任何查詢字符串傳遞到底層DBMS驅(qū)動(dòng)程序提供內(nèi)置功能,便于將包含轉(zhuǎn)義序列的SQL查詢轉(zhuǎn)換為數(shù)據(jù)庫可理解的格式提供DatabaseMetaData
接口,允許用戶檢索關(guān)于所使用的DBMS信息2023/11/30134.1.5SQL的一致性DatabaseMetaData
接口的主要方法如下:int
getDatabaseMajorVersion()StringgetDriverName()int
getMaxStatementLength()ResultSet
getTypeInfo()StringgetUserName()boolean
isReadOnly()ResultSet
getPrimaryKeys(Stringcatalog,Stringschema,Stringtable)等2023/11/30144.1.5SQL的一致性由于JDBCAPI將用作開發(fā)高級(jí)數(shù)據(jù)庫訪問工具和API的基礎(chǔ)API,因此它還必須注意其所有上層建筑的一致性。用戶可依賴的JDBC功能的標(biāo)準(zhǔn)級(jí)別是“符合JDBC標(biāo)準(zhǔn)TM”。驅(qū)動(dòng)程序開發(fā)人員可用JDBCAPI所帶的測試工具包來確定他們的驅(qū)動(dòng)程序是否符合這些標(biāo)準(zhǔn)2023/11/30154.1.6JDBC產(chǎn)品組件JavaSoft提供三種JDBC產(chǎn)品組件:Java開發(fā)工具包(JDK)的組成部份:JDBC驅(qū)動(dòng)程序管理器;JDBC驅(qū)動(dòng)程序測試工具包JDBC-ODBC橋。JDBC驅(qū)動(dòng)程序管理器是JDBC體系結(jié)構(gòu)的支柱。其主要作用是把Java應(yīng)用程序連接到正確的JDBC驅(qū)動(dòng)程序上。2023/11/30164.1.6JDBC產(chǎn)品組件JDBC驅(qū)動(dòng)程序測試工具包為使JDBC驅(qū)動(dòng)程序運(yùn)行您的程序提供一定的可信度。JDBC-ODBC橋使ODBC驅(qū)動(dòng)程序可被用作JDBC驅(qū)動(dòng)程序。它的實(shí)現(xiàn)為JDBC的快速發(fā)展提供了一條途徑,其長遠(yuǎn)目標(biāo)提供一種訪問某些不常見的DBMS(如果對(duì)這些不常見的DBMS未實(shí)現(xiàn)JDBC)的方法。2023/11/30174.1.7JDBC驅(qū)動(dòng)程序的類型JDBC驅(qū)動(dòng)程序的類型JDBC-ODBC橋加ODBC驅(qū)動(dòng)程序本地APIJDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序本地協(xié)議純Java驅(qū)動(dòng)程序2023/11/3018JDBC回顧2023/11/30191.JDBC-ODBC橋加ODBC驅(qū)動(dòng)程序第一類:JDBC-ODBC橋+ODBC驅(qū)動(dòng)程序2023/11/30202.本地API第二類:本地API2023/11/30213.JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序第三類:JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序2023/11/30224.本地協(xié)議純Java驅(qū)動(dòng)程序第四類:本地協(xié)議純Java驅(qū)動(dòng)程序第3、4類驅(qū)動(dòng)程序是從JDBC訪問數(shù)據(jù)庫的首選方法2023/11/30234.2使用JDBC要使用JDBC技術(shù)主要包括以下步驟:注冊(cè)和加載驅(qū)動(dòng)器與數(shù)據(jù)庫建立連接發(fā)送SQL語句處理結(jié)果2023/11/30244.2.1注冊(cè)和加載JDBC驅(qū)動(dòng)程序DriverManager類是JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間它跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫和相應(yīng)驅(qū)動(dòng)程序之間建立連接注冊(cè)驅(qū)動(dòng)程序使用DriverManager.registerDrive()方法用戶正常情況下將不用直接調(diào)用DriverManager.registerDriver(),而是在加載驅(qū)動(dòng)程序時(shí)由驅(qū)動(dòng)程序自動(dòng)調(diào)用。加載Driver類的方式是通過調(diào)用方法Class.forName()2023/11/30254.2.1注冊(cè)和加載JDBC驅(qū)動(dòng)程序注冊(cè)DriverManager.registerDriver(driver);加載:使用JDBC-ODBC橋驅(qū)動(dòng)程序的語句如下:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");使用Oracle8i的JDBC驅(qū)動(dòng)程序的語句如下:Class.forName("oracle.jdbc.driver.OracleDriver");使用SQLSERVER的JDBC驅(qū)動(dòng)程序的加載語句如下:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");2023/11/30264.2.2建立連接1.建立連接的方法與數(shù)據(jù)庫建立連接的標(biāo)準(zhǔn)方法是調(diào)用DriverManager.getConnection()方法。該方法的原型是:staticConnectiongetConnection(String
url,Stringuser,Stringpassword)throwsSQLException該方法接受由某個(gè)URL字符串指明的數(shù)據(jù)源、數(shù)據(jù)源的用戶名和口令字2023/11/30274.2.2建立連接使用JDBC-ODBC橋的連接語句如下:DriverManager.getConnection("jdbc:odbc:emp",”aaa”,”bbb”);使用SQLSERVER的連接語句如下:Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";Stringuser="sa";Stringpassword="";Connectionconn=DriverManager.getConnection(url,user,password);2023/11/30284.2.2建立連接Oracle提供了2種JDBC驅(qū)動(dòng)程序:JDBCOCI驅(qū)動(dòng)程序Connectioncon=DriverManager.getConnection("jdbc:oracle:oci8:@db","scott","tiger");JDBCThin驅(qū)動(dòng)程序Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@host:1521:db","scott","tiger");2023/11/30294.2.2建立連接2.關(guān)于URL一般URL(統(tǒng)一資源定位符)提供在Internet上定位資源所需的信息,如:/docs/JDK-1_apidocs.zip3.關(guān)于JDBCURLJDBCURL提供了一種標(biāo)識(shí)數(shù)據(jù)庫的方法,可以使相應(yīng)的驅(qū)動(dòng)程序能識(shí)別該數(shù)據(jù)庫并與之建立連接。它由三部分組成,各部分間用冒號(hào)分隔:jdbc:<子協(xié)議>:<子名稱>2023/11/30304.2.2建立連接JDBC連接由數(shù)據(jù)庫URL標(biāo)識(shí)jdbc:<subprotocol>:<subname>子協(xié)議名的典型示例是“odbc”,如:jdbc:odbc:<ODBCDSN>;User=<username>;PW=<password><子名稱>是一種標(biāo)識(shí)數(shù)據(jù)庫的方法。子名稱可以依不同的子協(xié)議而變化,如果數(shù)據(jù)庫是通過Internet來訪問的,則在JDBCURL中應(yīng)將網(wǎng)絡(luò)地址作為子名稱的一部份包括進(jìn)去,且必須遵循如下所示的標(biāo)準(zhǔn)URL命名約定://主機(jī)名:端口/子協(xié)議2023/11/3031注冊(cè)32位數(shù)據(jù)源要使用橋必須注冊(cè)O(shè)DBC數(shù)據(jù)源2023/11/30324.2.3發(fā)送SQL語句JDBC對(duì)可被發(fā)送的SQL語句類型不加任何限制。這就提供了很大的靈活性,即允許使用特定的數(shù)據(jù)庫語句或甚至于非SQL語句然而,它要求用戶自己負(fù)責(zé)確保所涉及的數(shù)據(jù)庫可以處理所發(fā)送的SQL語句。例如,如果某個(gè)應(yīng)用程序試圖向不支持儲(chǔ)存程序的DBMS發(fā)送儲(chǔ)存程序調(diào)用,就會(huì)失敗并將拋出異常。2023/11/30334.2.3發(fā)送SQL語句其實(shí)存在三種Statement對(duì)象:StatementPreparedStatement(從Statement繼承而來)用于執(zhí)行帶或不帶IN參數(shù)的預(yù)編譯SQL語句CallableStatement(從PreparedStatement繼承而來)用于執(zhí)行對(duì)數(shù)據(jù)庫已存儲(chǔ)過程的調(diào)用2023/11/30341.創(chuàng)建Statement對(duì)象Statement對(duì)象將SQL語句發(fā)送到DBMS由Connection的createStatement()方法創(chuàng)建Statement對(duì)象:
publicStatementcreateStatement()throwsSQLException通常Statementstmt=conn.createStatement();2023/11/30351.創(chuàng)建Statement對(duì)象Statement接口中的主要方法有:ResultSet
executeQuery(Stringsql)int
executeUpdate(Stringsql)booleanexecute(Stringsql)boolean
getMoreResults()//檢測是否有多個(gè)結(jié)果集voidclose()//關(guān)閉Statement對(duì)象int
getMaxFieldSize()//獲得字段最大長度voidsetMaxFieldSize(intmax)//設(shè)置字段最大長度2023/11/30361.創(chuàng)建Statement對(duì)象Statement接口中的主要方法有(續(xù)):int
getMaxRows()//獲得最大行數(shù)voidsetMaxRows(intmax)//設(shè)置最大行數(shù)int
getQueryTimeout()//獲得查詢超時(shí)時(shí)間限voidsetQueryTimeout(intseconds)//設(shè)定查詢超時(shí)時(shí)間限java.sql.SQLWarning
getWarnings()//獲得與statement對(duì)象有關(guān)的警告ResultSet
getResultSet()//得到下一個(gè)結(jié)果集int
getUpdateCount()//得到修改的行數(shù)其中最重要的方法是executeQuery(),executeUpdate(),andexecute().2023/11/3037提交查詢Statement對(duì)象的方法:executeUpdate()用來創(chuàng)建和更新表stmt.executeUpdate(query);
executeQuery()對(duì)于SELECT語句stmt.executeQuery(query);
2023/11/3038提交查詢execute()stmt.execute();返回布爾值,用于執(zhí)行任何SQL語句,返回多個(gè)結(jié)果集的情況通常:ResultSet
rs
=stmt.executeQuery(query);2023/11/3039提交查詢DDL命令包括create、alter和dropstat.executeUpdate("createtableCustomer(CustIdnumber(3),CustNamevarchar2(15),Addressvarchar2(30))");DML命令包括select、insert、update和deleteRecordSet
recset=stat.executeQuery("select*fromcustomer");2023/11/3040提交查詢用于產(chǎn)生單個(gè)結(jié)果集的SELECT語句。publicResultSet
executeQuery(String
sql)throwsSQLException用于執(zhí)行INSERT,UPDATE或DELETE語句以及SQLDDL語句,例如CREATETABLE和DROPTABLE。該方法返回一個(gè)整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。對(duì)于CREATETABLE或DROPTABLE等不操作行的語句,返回值總為零。publicint
executeUpdate(String
sql)throwsSQLException2023/11/30412.創(chuàng)建PreparedStatement對(duì)象要多次執(zhí)行一個(gè)SQL語句,使用PreparedStatementSQL語句在創(chuàng)建時(shí)提供參數(shù)在執(zhí)行PreparedStatement時(shí),只傳遞參數(shù)值通過不同的參數(shù)值多次調(diào)用PreparedStatement對(duì)象表示預(yù)編譯SQL語句。2023/11/30422.創(chuàng)建PreparedStatement對(duì)象由Connection的prepareStatement()方法創(chuàng)建publicPreparedStatement
prepareStatement(String
sql)throwsSQLException如:PreparedStatementpStmt=conn.preparedStatement("insertintoemp(empno,ename)values(?,?)");
即:可以處理in型參數(shù)在生成PreparedStatement對(duì)象的字符串中用“?”代表一個(gè)可以產(chǎn)生變化的參數(shù),2023/11/30432.創(chuàng)建PreparedStatement對(duì)象在創(chuàng)建
PreparedStatement
對(duì)象之后,必須為參數(shù)賦值使用setXXX()方法可以將第parameterIndex個(gè)參數(shù)賦值為x。publicvoidsetInt(int
parameterIndex,int
x)throwsSQLException用executeUpdate(),executeQuery(),execute()方法執(zhí)行SQL語句2023/11/3044PreparedStatement對(duì)象常用的方法voidsetByte(int
parameterIndex,bytex)voidsetBytes(int
parameterIndex,bytex[])voidsetDate(int
parameterIndex,java.sql.Datex)voidsetDouble(int
parameterIndex,doublex)voidsetFloat(int
parameterIndex,floatx)voidsetInt(int
parameterIndex,intx)voidsetLong(int
parameterIndex,longx)voidsetShort(int
parameterIndex,shortx)voidsetString(int
parameterIndex,Stringx)voidsetTime(int
parameterIndex,java.sql.Timex)2023/11/3045PreparedStatement對(duì)象常用的方法voidsetTimestamp(int
parameterIndex,java.sql.Timestampx)voidsetUnicodeStream(int
parameterIndex,java.io.InputStreamx,intlength)voidsetObject(int
parameterIndex,Objectx)ResultSet
executeQuery()int
executeUpdate()booleanexecute()2023/11/30462.創(chuàng)建PreparedStatement對(duì)象說明參數(shù)parameterIndex表示在構(gòu)造PreparedStatement對(duì)象時(shí)”?”從左到右出現(xiàn)的位置,從1開始。參數(shù)x表示給”?”設(shè)定的值。究竟用哪一個(gè)setXXX()方法,由”?”所表示的參數(shù)類型來決定因?yàn)閤的類型是java.sql.Types中的類型,而參數(shù)的類型是某種數(shù)據(jù)庫中的數(shù)據(jù)類型,因此應(yīng)該保證它們的類型能夠相對(duì)應(yīng)。一般來說,它們有下面的對(duì)應(yīng)關(guān)系如表4-1所示。2023/11/30472.創(chuàng)建PreparedStatement對(duì)象
JDBC類型java類型DATALINK.URLDATEjava.sql.DateTIMEjava.sql.TimeBIGINTlongSMALLINTshortCHAR,VARCHAR,LONGVARCHARStringJAVA_OBJECTjavaclassNUMERICjava,math.BigDecimalINTEGERint,IntegerREALfloat,FloatDOUBLEdouble,DoubleBIT,BOOLEANboolean,BooleanARRAYArrayTINYINTbyteBINARY,VARBINARY,LONGVARBINARYbyte[]2023/11/30482.創(chuàng)建PreparedStatement對(duì)象在程序中可以用循環(huán)語句生成這一系列的語句,從而方便此類SQL語句的生成。可以用PreparedStatement對(duì)象的publicvoidaddBatch()throwsSQLException
方法將其加入到一個(gè)批次作業(yè)。最后用PreparedStatement對(duì)象的publicint[]executeBatch()throwsSQLException方法一次執(zhí)行所有加入的批次作業(yè)。2023/11/30492.創(chuàng)建PreparedStatement對(duì)象例如:PrepareStatementp=con.prepareStatement(“insertintocityvalues(?)”);For(inti=0;i<aa.length;i++){ p.setString(1,aa[i]);p.addBatch();}p.excuetBatch();注:preparedStatement
對(duì)象有可能比Statement對(duì)象的效率更高2023/11/30503.創(chuàng)建CallableStatement對(duì)象CallableStatement
用于執(zhí)行SQL存儲(chǔ)過程CallableStatement對(duì)象為數(shù)據(jù)庫提供了一種以標(biāo)準(zhǔn)形式調(diào)用儲(chǔ)存過程的方法。由Connection對(duì)象的prepareCall()方法創(chuàng)建publicCallableStatement
prepareCall(String
sql)throwsSQLExceptionsql的形式為:{[?=]call<storedprocedurename>[<parameter>,<parameter>...]}
2023/11/30513.創(chuàng)建CallableStatement對(duì)象它支持in和out型參數(shù),如:CallableStatement
cStmt=conn.prepareCall("{call
showEmployees(?,?)}");注意:在創(chuàng)建CallableStatement對(duì)象前應(yīng)檢查所用的數(shù)據(jù)庫是否支持存儲(chǔ)過程,使用DataMetaData對(duì)象的supportsStoredProcedures():publicboolean
supportsStoredProcedures()throwsSQLExceptionIn或out型參數(shù)取決于存儲(chǔ)過程2023/11/30523.創(chuàng)建CallableStatement對(duì)象OUT參數(shù)要使用registerOutParameter()方法進(jìn)行注冊(cè)登記publicvoidregisterOutParameter(int
parameterIndex,int
sqlType)throwsSQLExceptionIN參數(shù)使用setXXX()方法設(shè)置實(shí)際值,設(shè)置字符串參數(shù)為:publicvoidsetString(int
parameterIndex,Stringx)throwsSQLException使用CallableStatement對(duì)象的execute()方法執(zhí)行該存儲(chǔ)過程。publicbooleanexecute()throwsSQLExceptionOUT參數(shù)使用getXXX()方法取得返回值,取得字符串的方法為:publicStringgetString(int
parameterIndex)throwsSQLException2023/11/30533.創(chuàng)建CallableStatement對(duì)象舉例:createorreplaceprocedureshow(nameoutvarchar2,numinnumber)asbeginselectEnameintonamefromempwhereempno=num;end;callableStatement
cs=con.prepareCall(“{callshow(?,?)}”);Cs.registerOutParameter(1,java.sql.Types.CHAR);Cs.setInt(2,7777);Cs.execute();Stringstr=cs.getString(1);//存儲(chǔ)過程必須用{},它是調(diào)用存儲(chǔ)過程的轉(zhuǎn)意符2023/11/30543.創(chuàng)建CallableStatement對(duì)象主要方法:floatgetFloat(int
parameterIndex)//返回序號(hào)為parameterIndex參數(shù)的float類型值StringgetString(int
parameterIndex)//返回序號(hào)為parameterIndex參數(shù)的String類型值voidregisterOutParameter(int
parameterIndex,int
sqlType)//將序號(hào)為parameterIndex的參數(shù)注冊(cè)為JDBC中的sqlType類型voidsetDouble(String
parameterName,doublex)//設(shè)置參數(shù)parameterName為double類型值xvoidsetFloat(String
parameterName,floatx)//設(shè)置參數(shù)parameterName為float類型值x等等2023/11/30554.2.4使用Statement對(duì)象執(zhí)行語句創(chuàng)建了Statement對(duì)象(或preparedStatement對(duì)象、CallableStatement對(duì)象),完成了SQL語句發(fā)送后,就要調(diào)用Statement對(duì)象(或preparedStatement對(duì)象、CallableStatement對(duì)象)中的方法執(zhí)行該SQL語句,進(jìn)而得到執(zhí)行的結(jié)果Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery()、executeUpdate()和execute()2023/11/30564.2.4使用Statement對(duì)象執(zhí)行語句對(duì)這3個(gè)execute方法作以下說明:3個(gè)都適用于任何的SQL語句,究竟使用哪一個(gè)方法由希望得到的返回值的類型來決定所有的execute()方法都將關(guān)閉所調(diào)用的Statement對(duì)象的當(dāng)前打開結(jié)果集(如果存在)PreparedStatement
接口雖然繼承了Statement接口中所有方法,但是它有自己的executeQuery()、executeUpdate()和execute()方法因?yàn)樵趧?chuàng)建Statement對(duì)象時(shí)并不包含SQL語句,所以必須給Statement的execute方法提供SQL語句作為參數(shù)這些execute方法有可能拋出SQLException
2023/11/30574.2.5ResultSet對(duì)象
ResultSet對(duì)象是executeQuery()方法的返回值,它被稱為結(jié)果集,它代表符合SQL語句條件的所有行ResultSet
對(duì)象包含SQL語句的執(zhí)行結(jié)果它通過一套get方法提供了對(duì)這些行中數(shù)據(jù)的訪問,即使用getXXX
方法檢索數(shù)據(jù)getInt()用于檢索整型值getString()用于檢索字符串值2023/11/30581.ResultSet對(duì)象說明:上述get方法很多,究竟用哪一個(gè)getXXX()方法,由列的數(shù)據(jù)類型來決定。上面同一種類型的getXXX()方法是成對(duì)出現(xiàn)的,一個(gè)是根據(jù)列號(hào)得到值,另一個(gè)是根據(jù)列名得到值。結(jié)果集游標(biāo)即可以從第一行移動(dòng)到最后一行,也可以從最后一行移動(dòng)到第一行。在java.sql包中有很多對(duì)象都有g(shù)etWarnings()方法,這里的getWarnings()是與結(jié)果集相關(guān)的警告2023/11/30591.ResultSet對(duì)象ResultSet中的主要方法:publicint
getInt(int
columnIndex)throwsSQLExceptionpublicint
getInt(String
columnName)throwsSQLExceptionpublicStringgetString(int
columnIndex)throwsSQLExceptionpublicStringgetString(String
columnName)throwsSQLExceptionbooleannext()//將游標(biāo)移動(dòng)到結(jié)果集的下一行booleanprevious()//將游標(biāo)移動(dòng)到結(jié)果集的上一行voidclose()//關(guān)閉結(jié)果集boolean
wasNull()//檢測結(jié)果集是否為空booleanfirst()//移動(dòng)游標(biāo)到ResultSet結(jié)果集的第一行booleanlast()等等2023/11/30601.ResultSet對(duì)象代碼描述:import.URL;importjava.sql.*;importoracle.jdbc.driver.*;Class.forName("oracle.jdbc.driver.OracleDriver");Connectioncon=DriverManager.getConnection("jdbc:oracle:oci8:@oradb","scott","tiger");2023/11/3061代碼描述(續(xù))Statementstmt=conn.createStatement();ResultSetr=stmt.executeQuery("SELECTa,b,cFROMTable1");While(r.next()){
inti=r.getInt("a");
Strings=r.getString("b");
floatf=r.getFloat("c");
System.out.println("ROW="+i+""+s+""+f);}stmt.close();con.close();2023/11/30622.行和游標(biāo)ResultSet對(duì)象自動(dòng)維護(hù)指向其當(dāng)前數(shù)據(jù)行的游標(biāo)。每調(diào)用一次next()方法,游標(biāo)向下移動(dòng)一行。最初它位于第一行之前,因此第一次調(diào)用next(),將把游標(biāo)置于第一行上,使它成為當(dāng)前行。隨著每次調(diào)用next(),導(dǎo)致游標(biāo)向下移動(dòng)一行,按照從上至下的次序獲取ResultSet
行。在ResultSet對(duì)象或其對(duì)應(yīng)的Statement對(duì)象關(guān)閉之前,游標(biāo)一直保持有效2023/11/30632.行和游標(biāo)結(jié)果集的游標(biāo)是有名字的。如果數(shù)據(jù)庫允許定位更新或定位刪除,則需要將光標(biāo)的名字作為參數(shù)提供給更新或刪除命令??赏ㄟ^調(diào)用方法getCursorName()獲得游標(biāo)名。不是所有的DBMS都支持定位更新和刪除。可使用DatabaseMetaData的supportsPositionedDelete()和supportsPositionedUpdate()方法來檢查特定連接是否支持這些操作。2023/11/30642.行和游標(biāo)有時(shí)候需要結(jié)果集的游標(biāo)前后移動(dòng),這是可使用滾動(dòng)結(jié)果集。為了獲得滾動(dòng)結(jié)果集,必須先用下面方法得到一個(gè)Statement對(duì)象:Statementst=con.createStatement(inttype,intconcurrency);根據(jù)type和concurrency的取值,當(dāng)執(zhí)行ResultSetr=st.executeQuery()時(shí),會(huì)返回不同類型的結(jié)果集。2023/11/30652.行和游標(biāo)type的取值決定滾動(dòng)方式,它可以?。篟esultSet.TYPE_FORWORD_ONLY:表示結(jié)果集只能向下滾動(dòng)ResultSet.TYPE_SCROLL_INSENSITIVE:表示結(jié)果集可以上下滾動(dòng),當(dāng)數(shù)據(jù)庫變化時(shí),結(jié)果集不變ResultSet.TYPE_SCROLL_SENSITIVE:表示結(jié)果集可以上下滾動(dòng),當(dāng)數(shù)據(jù)庫變化時(shí),結(jié)果集同步改變2023/11/30662.行和游標(biāo)concurrency取值表示是否可以用結(jié)果集更新數(shù)據(jù)庫,它的取值是:ResultSet.CONCUR_READ_ONLY:表示不能用結(jié)果集更新數(shù)據(jù)庫的表ResultSet.CONCUR_UPDATETABLE:表示能用結(jié)果集更新數(shù)據(jù)庫的表2023/11/30672.行和游標(biāo)滾動(dòng)結(jié)果集常用的方法有:publicbooleanprevious()publicvoidbeforeFirst()publicvoidafterLast()publicboolean
isAfterLast()publicboolean
isBeforeFirst()publicboolean
isFirst()publicboolean
isLast()publicint
getRow()publicboolean
absolute(introws)2023/11/30683.列方法getXXX()可按任何次序獲取列值,但為了保證可移植性,應(yīng)該從左至右獲取列值,并且一次性地讀取列值列是從左至右編號(hào)的,并且從列1開始getXXX()方法的輸入的列名不區(qū)分大小寫注意getXXX()方法的參數(shù)。如果select語句未指定列名(例如在“select*fromtable1”中或列是導(dǎo)出的時(shí)),則應(yīng)該使用列號(hào)2023/11/30693.列有些情況下,SQL查詢返回的結(jié)果集中可能有多個(gè)列具有相同的名字。如果列名用作getXXX()方法的參數(shù),則getXXX()將返回第一個(gè)匹配列名的值。因而,如果多個(gè)列具有相同的名字,則需要使用列索引來確保檢索了正確的列值。關(guān)于ResultSet中列的信息,可通過調(diào)用ResultSet的方法getMetaData()得到。返回的ResultSetMetaData對(duì)象將給出其ResultSet對(duì)象各列的編號(hào)、類型和屬性。2023/11/30703.列如果列名已知,但不知其索引,則可用方法findColumn()得到其列號(hào)
對(duì)于getXXX()方法,JDBC驅(qū)動(dòng)程序試圖將基本數(shù)據(jù)轉(zhuǎn)換成指定Java類型,然后返回適合的Java值4.數(shù)據(jù)類型和轉(zhuǎn)換2023/11/30715對(duì)非常大的值使用流ResultSet可以獲取任意大的LONGVARBINARY或LONGVARCHAR數(shù)據(jù)。方法之一是通過讓ResultSet類返回java.io.Input流來完成。從該流中可分塊讀取數(shù)據(jù)。注意:必須立即訪問這些流,因?yàn)樵谙乱淮螌?duì)ResultSet調(diào)用getXXX()時(shí)它們將自動(dòng)關(guān)閉JDBCAPI具有三個(gè)獲取流的方法,分別具有不同的返回值:getBinaryStream():返回只提供數(shù)據(jù)庫原字節(jié)而不進(jìn)行任何轉(zhuǎn)換的流。getAsciiStream():返回提供單字節(jié)ASCII字符的流getUnicodeStream():返回提供雙字節(jié)Unicode字符的流2023/11/30726.NULL結(jié)果值要確定給定結(jié)果值是否是JDBCNULL,必須先讀取該列,然后使用ResultSet的wasNull()方法檢查該次讀取是否返回JDBCNULL。當(dāng)使用ResultSet的getXXX()方法讀取JDBCNULL時(shí),方法wasNull()將返回下列值之一:Javanull值:對(duì)于返回Java對(duì)象的getXXX()方法(例如getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject
等)零值:對(duì)于getByte、getShort、getInt、getLong、getFloat
和getDoublefalse值:對(duì)于getBoolean2023/11/30737.可選結(jié)果集或多結(jié)果集有些情況下,應(yīng)用程序在執(zhí)行語句之前不知道該語句是否返回結(jié)果集。此外,有些已存儲(chǔ)過程可能返回幾個(gè)不同的結(jié)果集或更新計(jì)數(shù)。為了適應(yīng)這些情況,JDBC提供了一種機(jī)制,允許應(yīng)用程序執(zhí)行語句,然后處理由結(jié)果集和更新計(jì)數(shù)組成的任意集合這種機(jī)制的原理是首先調(diào)用一個(gè)完全通用的execute()方法,然后調(diào)用另外三個(gè)方法:getResultSet()、getUpdateCount()和getMoreResults()2023/11/30747.可選結(jié)果集或多結(jié)果集下面的代碼演示了一種方法用來確認(rèn)已訪問方法execute()所產(chǎn)生的全部結(jié)果集和更新計(jì)數(shù):stmt.execute(queryStringWithUnknownResults);
while(true){
int
rowCount=stmt.getUpdateCount();
if(rowCount>0){//它是更新計(jì)數(shù)
System.out.println("Rowschanged="+count);
stmt.getMoreResults();
continue;}2023/11/30757.可選結(jié)果集或多結(jié)果集if(rowCount==0){//DDL命令或0個(gè)更新
System.out.println("NorowschangedorstatementwasDDLcommand");
stmt.getMoreResults();
continue;}//執(zhí)行到這里,證明有一個(gè)結(jié)果集或沒有其它結(jié)果
ResultSet
rs=stmt.getResultSet();
if(rs!=null){
...//使用元數(shù)據(jù)獲得關(guān)于結(jié)果集列的信息
stmt.getMoreResults();else
break;//沒有其它結(jié)果}2023/11/30764.2.6關(guān)閉Statement對(duì)象和Connection對(duì)象作為一種好的編程風(fēng)格,應(yīng)在不需要Statement對(duì)象和Connection對(duì)象時(shí)顯式地關(guān)閉它們關(guān)閉Statement對(duì)象和Connection對(duì)象的語法形式為:publicvoidclose()throwsSQLException
用戶不必關(guān)閉ResultSet。當(dāng)產(chǎn)生它的Statement關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個(gè)結(jié)果時(shí),該ResultSet將被Statement自動(dòng)關(guān)閉2023/11/30774.2.6關(guān)閉Statement對(duì)象和Connection對(duì)象下面例子通過JDBC-ODBC橋方式訪問SQLServer數(shù)據(jù)庫pubs中的表jobs,里面記錄員工號(hào)碼和描述信息job_desc。需要說明的是,為了使用JDBC-ODBC橋,需要注冊(cè)32位數(shù)據(jù)源。本例的運(yùn)行結(jié)果如圖4-7所示。2023/11/30784.2.6關(guān)閉Statement對(duì)象和Connection對(duì)象下例與上例使用相同的數(shù)據(jù)源,通過使用PrepareStatement對(duì)象在表jobs中插入一條記錄。我們通過SQLServer企業(yè)管理器打開pubs數(shù)據(jù)庫的jobs表,看到新紀(jì)錄確實(shí)已經(jīng)插入了,運(yùn)行結(jié)果如圖4-8所示2023/11/30794.2.7事務(wù)事務(wù)是由具有“原子性”的一個(gè)或多個(gè)語句,即這些語句要么全部被執(zhí)行、完成并被提交,要么全部還原。當(dāng)調(diào)用提交方法commit()或回滾方法rollback()時(shí),當(dāng)前事務(wù)即告結(jié)束,另一個(gè)事務(wù)隨即開始。缺省情況下,新連接將處于自動(dòng)提交模式如果禁用自動(dòng)提交模式,事務(wù)將要等到commit()或rollback()方法被顯式調(diào)用時(shí)才結(jié)束,因此它將包括上一次調(diào)用commit()或rollback()方法以來所有執(zhí)行過的語句2023/11/30804.2.7事務(wù)下面例中,首先在SQLServer的pubs數(shù)據(jù)庫中新建一個(gè)student表,其中包括4個(gè)字段:學(xué)號(hào)SNO、姓名SNAME、年齡SAGE、所在系SDEPT。然后以批處理方式插入4條記錄,這4條記錄的插入放在一個(gè)事務(wù)中一起提交。若4條記錄中有一條插入不成功,就回滾事務(wù),全部放棄4條記錄的插入。關(guān)鍵代碼:
con.setAutoCommit(false);//取消自動(dòng)提交
sta.addBatch("insertintostudent"+"values(1,'張三',18,'計(jì)算機(jī)')");
sta.addBatch("insertintostudent"+"values(2,'李四',19,'信息')");
sta.addBatch("insertintostudent"+"values(3,'王五',18,'計(jì)算機(jī)')");
sta.addBatch("insertintostudent"+"values(4,'趙六',20,'信息')");
int[]updateCount=sta.executeBatch();
mit();//此時(shí)提交
con.setAutoCommit(true);//恢復(fù)自動(dòng)提交2023/11/30814.2.8事務(wù)隔離級(jí)別如果DBMS支持事務(wù)處理,它必須有某種途徑來管理兩個(gè)事務(wù)同時(shí)對(duì)一個(gè)數(shù)據(jù)庫進(jìn)行操作時(shí)可能發(fā)生的沖突用戶可指定事務(wù)隔離級(jí)別(即隔離粒度),以指明DBMS應(yīng)該花多大精力來解決潛在沖突JDBC用戶可用以下代碼來指示DBMS允許在值被提交前讀取該值(“dirty讀取”),其中con是當(dāng)前連接:con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);事務(wù)隔離級(jí)別越高,為避免沖突所花的精力也就越多當(dāng)創(chuàng)建Connection對(duì)象時(shí),其事務(wù)隔離級(jí)別取決于驅(qū)動(dòng)程序,但通常是所涉及的數(shù)據(jù)庫的缺省值用戶可通過調(diào)用Connection對(duì)象的setIsolationLevel()方法來更改事務(wù)隔離級(jí)別2023/11/3082多種數(shù)據(jù)庫的支持2023/11/3083OracleClass.forName("oracle.jdbc.driver.OracleDriver").newInstance();Stringurl="jdbcracle:thin:@localhost:1521rcl";//orcl為你的數(shù)據(jù)庫的SIDStringuser="scott";Stringpassword="tiger";Connectionconn=DriverManager.getConnection(url,user,password);Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);Stringsql="select*fromtest";ResultSet
rs=stmt.executeQuery(sql);rs.close();stmt.close();conn.close();2023/11/3084SQLServerClass.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";//pubs為你的數(shù)據(jù)庫的
Stringuser="sa";Stringpassword="";Connectionconn=DriverManager.getConnection(url,user,password);Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);Stringsql="select*fromtest";ResultSet
rs=stmt.executeQuery(sql);rs.close();stmt.close();conn.close();2023/11/3085DB2Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();Stringurl="jdbc:db2://localhost:5000/sample";//sample為你的數(shù)據(jù)庫名
Stringuser="admin";Stringpassword="";Connectionconn=DriverManager.getConnection(url,user,password);Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);Stringsql="select*fromtest";ResultSet
rs=stmt.executeQuery(sql);rs.close();stmt.close();conn.close();2023/11/3086MySQLClass.forName("org.gjt.mm.mysql.Driver").newInstance();Stringurl="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"http://testDB為你的數(shù)據(jù)庫名
Connectionconn=DriverManager.getConnection(url);Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);Stringsql="select*fromtest";ResultSet
rs=stmt.executeQuery(sql);rs.close();stmt.close();conn.close();2023/11/3087Jdb類步驟總覽2023/11/30884.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫無論訪問什么數(shù)據(jù)庫,使用JDBC-ODBC橋的方法完全一樣,即先注冊(cè)32位數(shù)據(jù)源,再按照上節(jié)中的步驟(注冊(cè)和加載驅(qū)動(dòng)器、與數(shù)據(jù)庫建立連接、發(fā)送SQL語句和處理結(jié)果)使用數(shù)據(jù)庫.2023/11/30894.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫設(shè)置一個(gè)數(shù)據(jù)源。在控制面板上選擇ODBC數(shù)據(jù)源,雙擊ODBC數(shù)據(jù)源圖標(biāo),出現(xiàn)如圖4-10所示界面.2023/11/30904.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫選擇“用戶DSN”,單擊“添加”按鈕,添加新的數(shù)據(jù)源,如圖4-11所示。2023/11/30914.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫設(shè)置數(shù)據(jù)源具體項(xiàng)目的對(duì)話框,如圖4-12所示.2023/11/30924.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫在名稱欄里為數(shù)據(jù)源起個(gè)名字,這里起名為aaa.在圖4-13選擇連接SQLServer的ID,選擇“使用用戶輸入登記標(biāo)識(shí)號(hào)和密碼的SQLServer驗(yàn)證”選項(xiàng),選擇用戶名為sa,不需密碼.也可以選擇Windows驗(yàn)證2023/11/30934.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫在圖4-14選中“改變默認(rèn)的數(shù)據(jù)庫為”復(fù)選框,在下拉菜單里選擇用戶sa有權(quán)訪問的數(shù)據(jù)庫pubs.2023/11/30944.3在JSP中通過JDBC-ODBC橋使用數(shù)據(jù)庫在圖4-15中單擊“測試數(shù)據(jù)源”按鈕,如果正常就會(huì)出現(xiàn)數(shù)據(jù)源設(shè)置成功窗口.2023/11/30954.3.1順序查詢?cè)趀xample4_1.jsp中,查詢student表中的全部記錄,運(yùn)行結(jié)果如圖4-17所示。example4_1.jsp關(guān)鍵代碼:con=DriverManager.getConnection("jdbc:odbc:aaa","","");
sql=con.createStatement();
rs=sql.executeQuery("SELECT*FROMstudent");
while(rs.next()){out.print("<TR>");
out.print("<TD>"+rs.getString(1)+"</TD>");
out.print("<TD>"+rs.getString(2)+"</TD>");
out.print("<TD>"+rs.getInt("shuxue")+"</TD>");
out.print("<TD>"+rs.getInt("yingyu")+"</TD>");
out.print("<TD>"+rs.getInt("wuli")+"</TD>");
out.print("</TR>");}2023/11/3096圖4-17example4_1.jsp運(yùn)行結(jié)果2023/11/30974.3.1順序查詢?cè)趀xample4_2.jsp中,查詢student表中“微機(jī)原理成績大于90”的記錄,運(yùn)行結(jié)果如圖4-18所示。example4_2.jsp關(guān)鍵代碼:
try{con=DriverManager.getConnection("jdbc:odbc:aaa","","");
sql=con.createStatement();
rs=sql.executeQuery("SELECT*FROMstudentWHEREyingyu>=90");
while(rs.next()){out.print("<TR>");
out.print("<TD>"+rs.getString(2)+"</TD>");
out.print("<TD>"+rs.getInt("yingyu")+"</TD>");
out.print("</TR>");}2023/11/3098圖4-18example4_2.jsp運(yùn)行結(jié)果2023/11/30994.3.2隨機(jī)查詢example4_3.jsp查詢student表中的全部記錄,并將結(jié)果逆序輸出,最后單獨(dú)輸出第5條記錄。運(yùn)行結(jié)果如圖4-19所示example4_3.jsp關(guān)鍵代碼:
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=sql.executeQuery("SELECT*FROMstudent");
rs.last();
int
lownumber=rs.getRow();
out.print("該表共有"+lownumber+"條記錄");
out.print("<BR>現(xiàn)在逆序輸出記錄:");
rs.afterLast();
while(rs.previous())……2023/11/30100圖4-19example4_3.jsp運(yùn)行結(jié)果2023/11/301014.3.2隨機(jī)查詢example4_4.jsp將結(jié)果放到滾動(dòng)結(jié)果集中。用隨機(jī)數(shù)發(fā)生器隨機(jī)選取結(jié)果集中的4條記錄,顯示它們并計(jì)算它們的操作系統(tǒng)平均值。運(yùn)行結(jié)果如圖4-20所示。example4_4.jsp關(guān)鍵代碼:con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);//返回可滾動(dòng)的結(jié)果集:
rs=sql.executeQuery("SELECT*FROMstudent");while(抽取數(shù)目>0){inti=(int)(Math.random()*number+1);//隨機(jī)獲取一個(gè)1到number之間的數(shù)。
rs.absolute(i)……2023/11/30102
圖4-20example4_4.jsp運(yùn)行結(jié)果2023/11/301034.3.3參數(shù)查詢example4_5.jsp輸入查詢條件,可以按姓名查詢成績,也可以按分?jǐn)?shù)段查詢成績。運(yùn)行結(jié)果如圖4-21所示.若按照姓名查詢,請(qǐng)求提交byname.jsp,若按照分?jǐn)?shù)段查詢,請(qǐng)求提交給byscore.jsp
byname.jsp關(guān)鍵代碼:Stringname=request.getParameter("name");Stringcondition="SELECT*FROMstudentWHERExingming="+"'"+name+"'";
rs=sql.executeQuery(condition);byscore.jsp關(guān)鍵代碼:Stringenglishmax=request.getParameter("englishmax");Stringenglishmin=request.getParameter("englishmin");Stringmathmax=request.getParameter("mathmax");Stringmathmin=request.getParameter("mathmin");StringeCondition="yingyu<="+englishmax+"AND"+"yingyu>="+englishmin;StringmCondition="shuxue<="+mathmax+"AND"+"shuxue>="+mathmin;Stringcondition="SELECT*FROMstudentWHERE"+mCondition+"and"+eCondition;
rs=sql.executeQuery(condition);2023/11/30104
圖4-21example4_5.jsp運(yùn)行結(jié)果2023/11/301054.3.4排序查詢?cè)赟QL語句中使用ORDERBY子句對(duì)記錄進(jìn)行排序。例example4_6.jsp查詢所有學(xué)生成績,并可選擇按照3種方式排列記錄:按3科總分從高到低排列記錄;按姓氏拼音序排列記錄;按微機(jī)原理成績排列記錄。運(yùn)行結(jié)果如圖4-22所示.關(guān)鍵代碼:con=DriverManager.getConnection("jdbc:odbc:aaa","","");
sql=con.createStatement();Stringcondition="SELECT*FROMstudentORDERBYxingming”;
rs=sql.executeQuery(condition);2023/11/30106圖4-22example4-6運(yùn)行結(jié)果2023/11/301074.3.5更新記錄example4_8.jsp輸入學(xué)生姓名和成
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度寵物照料保姆雇傭合同協(xié)議書
- 商鋪轉(zhuǎn)讓服務(wù)合同
- 2025年度撫養(yǎng)權(quán)變更與財(cái)產(chǎn)分割調(diào)解合同模板
- 2025年度個(gè)人挖機(jī)租賃與施工驗(yàn)收服務(wù)合同
- 2025年度房東轉(zhuǎn)租合同-科技園區(qū)房產(chǎn)租賃
- 2025年度醫(yī)院醫(yī)護(hù)人員崗位調(diào)整與勞動(dòng)合同
- 2025年度互聯(lián)網(wǎng)企業(yè)期權(quán)投資合作協(xié)議
- 2025年度影視作品宣傳策劃代理合同
- 二零二五年度數(shù)字經(jīng)濟(jì)領(lǐng)域聘用業(yè)務(wù)經(jīng)理專屬合同
- 2025年度原油出口退稅及關(guān)稅優(yōu)惠合同
- 《影像增強(qiáng)檢查外周靜脈通路三級(jí)評(píng)價(jià)模式應(yīng)用規(guī)范》編制說明
- 2025年社區(qū)計(jì)生工作計(jì)劃(三篇)
- 2025年湖北中煙工業(yè)限責(zé)任公司招聘筆試高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025江西上饒經(jīng)濟(jì)技術(shù)開發(fā)區(qū)招商集團(tuán)限公司招聘29人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 石油行業(yè)海洋石油勘探與開發(fā)方案
- 醫(yī)囑或處方的督導(dǎo)檢查、總結(jié)、反饋及改進(jìn)措施
- 勞動(dòng)保護(hù)知識(shí)培訓(xùn)課件
- 山東工業(yè)職業(yè)學(xué)院《家政職業(yè)經(jīng)理人》2023-2024學(xué)年第一學(xué)期期末試卷
- 水果加工工廠規(guī)劃
- 十八洞精準(zhǔn)扶貧課件
- 2024年湖北省恩施利川市林業(yè)局直屬事業(yè)單位招聘18人歷年管理單位遴選500模擬題附帶答案詳解
評(píng)論
0/150
提交評(píng)論