




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
七JSP數據庫操作7.1數據庫技術概論什么是數據庫?通俗地說,數據庫就是用于集中存放大量信息的一種軟件,這種軟件提供了非常強大的功能來管理數據,如信息的查詢、修改、增加、刪除等。數據庫是非常復雜的軟件系統,其復雜程度甚至可比操作系統。將實現數據庫功能的軟件稱為DBMS(DatabaseManagementSystem,數據庫管理系統)。3數據庫的組織結構數據庫表記錄字段4數據庫表間的關聯關系表之間的關聯是現實生活中事物之間關聯關系的模擬。主鍵外鍵5在實際的數據庫設計中,經常使用“自增字段”來作為表的主鍵。7.2結構化查詢語言SQL什么是SQLSQL(StructuredQueryLanguage,結構化查詢語言),使用它來從數據庫中提取并操作各種數據。7SQL命令的分類SQL命令可以分成以下三類:DML(DataManipulationLanguage,數據操作語言):用于檢索或修改數據。DDL(DataDefinitionLanguage,數據定義語言):用于定義數據的結構,例如,創建、修改或刪除數據庫對象。DCL(DataControlLanguage,數據控制語言):用于定義數據庫用戶的權限。8常用的SQL命令Select:選擇數據Insert:插入數據Update:更新數據Delete:刪除數據9例:使用SSME執行SQL命令使用“新建查詢”命令,在“查詢”面板中書寫SQL命令。10書寫完SQL命令之后,可以先檢查語法,然后再執行。檢查語法執行SQL命令Insert:插入數據命令格式:
insertinto表名(列名列表)values(值列表)實例:11useClients--指明數據庫 insertintoOrderClient(
ClientName,AddressStr,PostCode,Telephone,Email) Values('張三','某省某市某街道某某號', '100081','12345678','SomeOne@');Update:更新數據基本格式
update表名set字段名=“字段新值”where滿足條件實例12updateOrderClient setAddressStr='無有國烏有省沒有市虛空街' WhereClientName='張三';Delete:刪除數據格式:
deletefrom表名where滿足條件實例:deletefromOrderClientwhereClientName='張三';13Select:選擇數據這是最靈活的SQL命令,有許多用法,最基本的格式為:
select表名.列名from表名列表where滿足條件上述基本格式還有許多變化,例如可以使用select命令進行排序和分組等。14三種基本關系數據操作選擇:用于選中滿足某種條件的數據
select*fromOrderClientwhereClientNameLike'張%'投影:只顯示記錄中的部分字段selectClientName,AddressStrfromOrderClient連接:從兩個以上的表中提取記錄注意:三種操作可以自由組合15useHappyBookShopselectBook.BookName,BookRemark.RemarkContentfromBook,BookRemarkwhereBook.BookID=BookRemark.BookIDAndBook.BookName='編程之美:微軟技術面試心得'視圖視圖是一個虛擬表,可以與真實的表一樣使用。其不同之處在于:它的數據是在使用時臨時通過執行SQL命令獲取的。基本格式:createview視圖名稱asseletct語句實例:16CreateviewBookNameAndBookRemarkasselectBook.BookName,BookRemark.RemarkContentfromBook,BookRemarkwhereBook.BookID=BookRemark.BookID
使用視圖視圖可以當成一個表一樣用。實例:17usehappybookshopselect*fromBookNameAndBookRemark存儲過程存儲過程類似于傳統編程語言中的“函數”。它是一組SQL命令的集合。基本格式:createprocedure存儲過程名(參數列表)asbegin --各種SQL語句end;18創建存儲過程示例:在Clients數據庫中創建存儲過程19createprocedureFindCustomerInfo( @FirstNameVARCHAR(20)=NULL)asbegin select*fromOrderClientwhereClientNamelike'%'+@FirstName+'%';end;執行存儲過程使用exec命令執行存儲過程實例:
execFindCustomerInfo'張'20統計數據:使用聚集函數所謂“聚集函數”,其實就是對一組記錄進行統計的一些函數:21常用的聚集函數MIN返回一個給定列中最小的數值MAX返回一個給定列中最大的數值SUM返回一個給定列中所有數值的總和AVG返回一個給定列中所有數值的平均值COUNT返回一個給定列中所有數值的個數COUNT(*)返回一個表中的行數22聚集函數使用示例——統計姓張的客戶數量selectcount(*)fromorderClientwhereClientNameLike'張'+'%';7.3JDBC概述23
JDBC是用于執行SQL語句的API類包,由一組用Java語言編寫的類和接口組成。JDBC提供了一種標準的應用程序設計接口,通過它可以訪問各類關系數據庫。7.3JDBC概述25JDBC的全稱為JavaDataBaseConnectivity,是一套面向對象的應用程序接口(API),制定了統一的訪問各類關系數據庫的標準接口,為各個數據庫廠商提供了標準接口的實現。通過JDBC技術,開發人員可以用純Java語言和標準的SQL語句編寫完整的數據庫應用程序,并且真正地實現了軟件的跨平臺性。在JDBC技術問世之前,各家數據庫廠商執行各自的一套API,使得開發人員訪問數據庫非常困難,特別是在更換數據庫時,需要修改大量代碼,十分不方便。JDBC很快就成為了Java訪問數據庫的標準。26JDBC是一種底層API,在訪問數據庫時需要在業務邏輯中直接嵌入SQL語句。由于SQL語句是面向關系的,依賴于關系模型,所以JDBC傳承了簡單直接的優點,特別是對于小型應用程序十分方便。
需要注意的是,JDBC不能直接訪問數據庫,必須依賴于數據庫廠商提供的JDBC驅動程序,通常情況下使用JDBC完成以下操作:(1)同數據庫建立連接;(2)向數據庫發送SQL語句;(3)處理從數據庫返回的結果。27數據庫數據庫數據庫OracleDriverJDBC-ODBCBridgeMySQLDriverDriver驅動程序管理器(DrvierManager)ConnectionPreparedStatementStatementCallableStatement結果集(ResultSet)結果集(ResultSet)結果集(ResultSet)應用層驅動程序層7.4JDBC的常用接口287.4JDBC中的常用接口
驅動程序接口Driver
驅動程序管理器DriverManager
數據庫連接接口Connection
執行SQL語句接口Statement
執行動態SQL語句接口PreparedStatement
執行存儲過程接口CallableStatement
訪問結果集接口ResultSet30
每種數據庫的驅動程序都應該提供一個實現java.sql.Driver接口的類,簡稱Driver類,在加載Driver類時,應該創建自己的實例并向java.sql.DriverManager類注冊該實例。通常情況下通過java.lang.Class類的靜態方法forName(StringclassName),加載要連接數據庫的Driver類,該方法的入口參數為要加載Driver類的完整包名。成功加載后,會將Driver類的實例注冊到DriverManager類中,如果加載失敗,將拋出ClassNotFoundException異常,即未找到指定Driver類的異常。7.4.1驅動程序接口Driver31java.sql.DriverManager類負責管理JDBC驅動程序的基本服務,是JDBC的管理層,作用于用戶和驅動程序之間,負責跟蹤可用的驅動程序,并在數據庫和驅動程序之間建立連接。另外,DriverManager類也處理諸如驅動程序登錄時間限制及登錄和跟蹤消息的顯示等工作。成功加載Driver類并在DriverManager類中注冊后,DriverManager類即可用來建立數據庫連接。7.4.2驅動程序管理器DriverManager32
當調用DriverManager類的getConnection()方法請求建立數據庫連接時,DriverManager類將試圖定位一個適當的Driver類,并檢查定位到的Driver類是否可以建立連接。如果可以,則建立連接并返回,如果不可以,則拋出SQLException異常。getConnection()方法有以下3種不同的函數重載形式:staticConnectiongetConnection(Stringurl)和一個通過URL指定的數據庫建立連接。33staticConnectiongetConnection(Stringurl,Propertiesinfo)和一個通過URL指定的數據庫建立連接,info提供了一些屬性,這些屬性里包括了user和password等屬性。staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)傳入參數用戶名為user,密碼為password,和一個通過URL指定的數據庫建立連接。URL的格式為:jdbc:subprotocol:subname34方法名稱功能描述getConnection(Stringurl,Stringuser,Stringpassword)為靜態方法,用來獲得數據庫連接,有3個入口參數,依次為要連接數據庫的URL、用戶名和密碼,返回值類型為java.sql.ConnectionsetLoginTimeout(intseconds)為靜態方法,用來設置每次等待建立數據庫連接的最長時間setLogWriter(java.io.PrintWriterout)為靜態方法,用來設置日志的輸出對象println(Stringmessage)為靜態方法,用來輸出指定消息到當前的JDBC日志流Stringurl=“jdbc:mysql://localhost/test?user=root&password=123456”;35java.sql.Connection接口負責與特定數據庫的連接,在連接的上下文中可以執行SQL語句并返回結果,還可以通過getMetaData()方法獲得由數據庫提供的相關信息,例如數據表、存儲過程和連接功能等信息。7.4.3數據庫連接接口Connection方法名稱功能描述createStatement()創建并返回一個Statement實例,通常在執行無參數的SQL語句時創建該實例prepareStatement()創建并返回一個PreparedStatement實例,通常在執行包含參數的SQL語句時創建該實例,并對SQL語句進行了預編譯處理36方法名稱功能描述prepareCall()創建并返回一個CallableStatement實例,通常在調用數據庫存儲過程時創建該實例setAutoCommit()設置當前Connection實例的自動提交模式,默認為true,即自動將更改同步到數據庫中,如果設為false,需要通過執行commit()或rollback()方法手動將更改同步到數據庫中getAutoCommit()查看當前的Connection實例是否處于自動提交模式,如果是則返回true,否則返回falsesetSavepoint()在當前事務中創建并返回一個Savepoint實例,前提條件是當前的Connection實例不能處于自動提交模式,否則將拋出異常releaseSavepoint()從當前事務中移除指定的Savepoint實例37setReadOnly()設置當前Connection實例的讀取模式,默認為非只讀模式,不能在事務當中執行該操作,否則將拋出異常,有一個boolean型的入口參數,設為true則表示開啟只讀模式,設為false則表示關閉只讀模式isReadOnly()查看當前的Connection實例是否為只讀模式,如果是則返回true,否則返回falseisClosed()查看當前的Connection實例是否被關閉,如果被關閉則返回true,否則返回falsecommit()將從上一次提交或回滾以來進行的所有更改同步到數據庫,并釋放Connection實例當前擁有的所有數據庫鎖定rollback()取消當前事務中的所有更改,并釋放當前Connection實例擁有的所有數據庫鎖定;該方法只能在非自動提交模式下使用,如果在自動提交模式下執行該方法,將拋出異常;有一個入口參數為Savepoint實例的重載方法,用來取消Savepoint實例之后的所有更改,并釋放對應的數據庫鎖定close()立即釋放Connection實例占用的數據庫和JDBC資源,即關閉數據庫連接38
java.sql.Statement接口用來執行靜態的SQL語句,并返回執行結果。例如,對于insert、update和delete語句,調用executeUpdate(Stringsql)方法,而select語句則調用executeQuery(Stringsql)方法,并返回一個永遠不能為null的ResultSet實例。7.4.4執行SQL語句接口Statement39方法名稱功能描述executeQuery(Stringsql)執行指定的靜態SELECT語句,并返回一個永遠不能為null的ResultSet實例executeUpdate(Stringsql)執行指定的靜態INSERT、UPDATE或DELETE語句,并返回一個int型數值,為同步更新記錄的條數clearBatch()清除位于Batch中的所有SQL語句,如果驅動程序不支持批量處理將拋出異常addBatch(Stringsql)將指定的SQL命令添加到Batch中,String型入口參數通常為靜態的INSERT或UPDATE語句,如果驅動程序不支持批量處理將拋出異常40方法名稱功能描述executeBatch()執行Batch中的所有SQL語句,如果全部執行成功,則返回由更新計數組成的數組,數組元素的排序與SQL語句的添加順序對應數組元素有以下幾種情況:①大于或等于零的數,說明SQL語句執行成功,為影響數據庫中行數的更新計數;②2,說明SQL語句執行成功,但未得到受影響的行數;③3,說明SQL語句執行失敗,僅當執行失敗后繼續執行后面的SQL語句時出現。如果驅動程序不支持批量,或者未能成功執行Batch中的SQL語句之一,將拋出異常close()立即釋放Statement實例占用的數據庫和JDBC資源,即關閉Statement實例41
java.sql.PreparedStatement接口繼承于Statement接口,是Statement接口的擴展,用來執行動態的sql語句,即包含參數的SQL語句。通過PreparedStatement實例執行的動態SQL語句,將被預編譯并保存到PreparedStatement實例中,從而可以反復并且高效地執行該SQL語句。
需要注意的是,在通過setXxx()方法為SQL語句中的參數賦值時,必須通過與輸入參數的已定義SQL類型兼容的方法,也可以通過setObject()方法設置各種類型的輸入參數。7.4.5執行動態SQL語句接口PreparedStatement42PreparedStatement的使用方法如下:PreparedStatementps=connection .prepareStatement("select*fromtable_namewhereid>?and(name=?orname=?)");ps.setInt(1,1);ps.setString(2,"wgh");ps.setObject(3,"sk");ResultSetrs=ps.executeQuery();43方法名稱功能描述executeQuery()執行前面包含參數的動態SELECT語句,并返回一個永遠不能為null的ResultSet實例executeUpdate()執行前面包含參數的動態INSERT、UPDATE或DELETE語句,并返回一個int型數值,為同步更新記錄的條數clearParameters()清除當前所有參數的值setXxx()為指定參數設置Xxx型值close()立即釋放Statement實例占用的數據庫和JDBC資源,即關閉Statement實例44java.sql.CallableStatement接口繼承于PreparedStatement接口,是PreparedStatement接口的擴展,用來執行SQL的存儲過程。
JDBCAPI定義了一套存儲過程SQL轉義語法,該語法允許對所有RDBMS通過標準方式調用存儲過程。該語法定義了兩種形式,分別是包含結果參數和不包含結果參數。如果使用結果參數,則必須將其注冊為OUT型參數,參數是根據定義位置按順序引用的,第一個參數的索引為1。7.4.6執行存儲過程接口CallableStatement45
為參數賦值的方法使用從PreparedStatement中繼承來的setXxx()方法。在執行存儲過程之前,必須注冊所有OUT參數的類型;它們的值是在執行后通過getXxx()方法檢索的。
CallableStatement可以返回一個或多個ResultSet實例。處理多個ResultSet對象的方法是從Statement中繼承來的。46java.sql.ResultSet接口類似于一個數據表,通過該接口的實例可以獲得檢索結果集,以及對應數據表的相關信息,例如列名和類型等,ResultSet實例通過執行查詢數據庫的語句生成。7.4.7訪問結果集接口ResultSet47
ResultSet實例具有指向其當前數據行的指針。最初,指針指向第一行記錄的前方,通過next()方法可以將指針移動到下一行,因為該方法在沒有下一行時將返回false,所以可以通過while循環來迭代ResultSet結果集。在默認情況下ResultSet對象不可以更新,只有一個可以向前移動的指針,因此,只能迭代它一次,并且只能按從第一行到最后一行的順序進行。如果需要,可以生成可滾動和可更新的ResultSet對象。48ResultSet接口提供了從當前行檢索不同類型列值的getXxx()方法,均有兩個重載方法,可以通過列的索引編號或列的名稱檢索,通過列的索引編號較為高效,列的索引編號從1開始。對于不同的getXxx()方法,JDBC驅動程序嘗試將基礎數據轉換為與getXxx()方法相應的Java類型,并返回適當的Java類型的值。49
在JDBC2.0API(JDK1.2)之后,為該接口添加了一組更新方法updateXxx(),均有兩個重載方法,可以通過列的索引編號或列的名稱指定列,用來更新當前行的指定列,或者初始化要插入行的指定列,但是該方法并未將操作同步到數據庫,需要執行updateRow()或insertRow()方法完成同步操作。方法名稱功能描述first()移動指針到第一行;如果結果集為空則返回false,否則返回true;如果結果集類型為TYPE_FORWARD_ONLY將拋出異常last()移動指針到最后一行;如果結果集為空則返回false,否則返回true;如果結果集類型為TYPE_FORWARD_ONLY將拋出異常50方法名稱功能描述previous()移動指針到上一行;如果存在上一行則返回true,否則返回false;如果結果集類型為TYPE_FORWARD_ONLY將拋出異常next()移動指針到下一行;指針最初位于第一行之前,第一次調用該方法將移動到第一行;如果存在下一行則返回true,否則返回falsebeforeFirst()移動指針到ResultSet實例的開頭,即第一行之前;如果結果集類型為TYPE_FORWARD_ONLY將拋出異常afterLast()移動指針到ResultSet實例的末尾,即最后一行之后;如果結果集類型為TYPE_FORWARD_ONLY將拋出異常absolute()移動指針到指定行;有一個int型入口參數,正數表示從前向后編號,負數表示從后向前編號,編號均從1開始;如果存在指定行則返回true,否則返回false;如果結果集類型為TYPE_FORWARD_ONLY將拋出異常51方法名稱功能描述relative()移動指針到相對于當前行的指定行;有一個int型入口參數,正數表示向后移動,負數表示向前移動,視當前行為0;如果存在指定行則返回true,否則返回false;如果結果集類型為TYPE_FORWARD_ONLY將拋出異常getRow()查看當前行的索引編號;索引編號從1開始,如果位于有效記錄行上則返回一個int型索引編號,否則返回0findColumn()查看指定列名的索引編號;該方法有一個String型入口參數,為要查看列的名稱,如果包含指定列,則返回int型索引編號,否則將拋出異常isBeforeFirst()查看指針是否位于ResultSet實例的開頭,即第一行之前,如果是則返回true,否則返回false52方法名稱功能描述isAfterLast()查看指針是否位于ResultSet實例的末尾,即最后一行之后,如果是則返回true,否則返回falseisFirst()查看指針是否位于ResultSet實例的第一行,如果是則返回true,否則返回falseisLast()查看指針是否位于ResultSet實例的最后一行,如果是則返回true,否則返回falseclose()立即釋放ResultSet實例占用的數據庫和JDBC資源,當關閉所屬的Statement實例時也將執行此操作7.5連接數據庫5354
在對數據庫進行操作時,首先需要連接數據庫,在JSP中連接數據庫大致可以分加載JDBC驅動程序、創建Connection對象的實例、執行SQL語句、獲得查詢結果和關閉連接等5個步驟。7.5連接數據庫
加載JDBC驅動程序創建數據庫連接執行SQL語句獲得查詢結果關閉連接55try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");}catch(ClassNotFoundExceptione){
System.out.println("加載數據庫驅動時拋出異常,內容如下:");
e.printStackTrace();}
在連接數據庫之前,首先要加載要連接數據庫的驅動到JVM(Java虛擬機),通過java.lang.Class類的靜態方法forName(StringclassName)實現。例如加載SQLServer2000驅動程序的代碼為:7.5.1加載JDBC驅動程序56
成功加載后,會將加載的驅動類注冊給DriverManager類,如果加載失敗,將拋出ClassNotFoundException異常,即未找到指定的驅動類,所以需要在加載數據庫驅動類時捕捉可能拋出的異常。技巧:通常將負責加載驅動的代碼放在static塊中,這樣做的好處是只有static塊所在的類第一次被加載時才加載數據庫驅動,避免重復加載驅動程序,浪費計算機資源。57Connectionconn=DriverManager.getConnection("jdbc:microsoft:sqlserver://:1433;DatabaseName=db_database08","sa","");
java.sql.DriverManager(驅動程序管理器)類是JDBC的管理層,負責建立和管理數據庫連接。通過DriverManager類的靜態方法getConnection(Stringurl,Stringuser,Stringpassword)可以建立數據庫連接,3個入口參數依次為要連接數據庫的路徑、用戶名和密碼,該方法的返回值類型為java.sql.Connection。
典型代碼如下:7.5.2創建數據庫連接58
建立數據庫連接(Connection)的目的是與數據庫進行通信,實現方式為執行SQL語句,但是通過Connection實例并不能執行SQL語句,還需要通過Connection實例創建Statement實例。
Statement實例又分為以下3種類型。Statement實例:該類型的實例只能用來執行靜態的SQL語句;
PreparedStatement實例:該類型的實例增加了執行動態SQL語句的功能;
CallableStatement對象:該類型的實例增加了執行數據庫存儲過程的功能。7.5.3執行SQL語句59
通過Statement接口的executeUpdate()或executeQuery()方法,可以執行SQL語句,同時將返回執行結果。如果執行的是executeUpdate()方法,將返回一個int型數值,代表影響數據庫記錄的條數,即插入、修改或刪除記錄的條數;如果執行的是executeQuery()方法,將返回一個ResultSet型的結果集,其中不僅包含所有滿足查詢條件的記錄,還包含相應數據表的相關信息,例如,列的名稱、類型和列的數量等。7.5.4獲得查詢結果resultSet.close();statement.close();connection.close();
在建立Connection,Statement和ResultSet實例時,均需占用一定的數據庫和JDBC資源,所以每次訪問數據庫結束后,應該及時銷毀這些實例,釋放它們占用的所有資源。方法是通過各個實例的close()方法,并且在關閉時建議按照以下的順序:7.5.5關閉連接61
采用上面的順序關閉的原因在于Connection是一個接口,close()方法的實現方式可能多種多樣。如果是通過DriverManager類的getConnection()方法得到的Connection實例,在調用close()方法關閉Connection實例時會同時關閉Statement實例和ResultSet實例。62
但是通常情況下需要采用數據庫連接池,在調用通過連接池得到的Connection實例的close()方法時,Connection實例可能并沒有被釋放,而是被放回到了連接池中,又被其他連接調用,在這種情況下如果不手動關閉Statement實例和ResultSet實例,它們在Connection中可能會越來越多,雖然JVM的垃圾回收機制會定時清理緩存,但是如果清理得不及時,當數據庫連接達到一定數量時,將嚴重影響數據庫和計算機的運行速度,甚至導致軟件或系統癱瘓。7.6典型JSP數據庫連接63647.6典型JSP數據庫連接SQLServer2000數據庫的連接
Access數據庫的連接
MySQL數據庫的連接7.6.1SQLServer2000數據庫的連接StringdriverClass="com.microsoft.jdbc.sqlserver.SQLServerDriver";SQLServer2000數據庫的驅動為:65
連接SQLServer2000數據庫需要用到的包有msbase.jar,mssqlserver.jar和msutil.jar。
連接SQLServer2000數據庫的URL為:Stringurl="jdbc:microsoft:sqlserver://:1433;DatabaseName=db_database08";667.6.2Access數據庫的連接StringdriverClass="sun.jdbc.odbc.JdbcOdbcDriver";Access數據庫的驅動為:
連接Access數據庫需要通過JDBC-ODBC方式,不需要引入任何包。連接Access數據庫的URL為:Stringurl="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=E:/db_database08.mdb";67
由于在上面的URL中采用的是系統默認的連接Access數據庫的驅動MicrosoftAccessDriver(*.mdb),所以不需要手動配置ODBC驅動;“E:/db_database08.mdb”為Access數據庫的絕對存放路徑,在實際程序中,可以通過request對象的相關方法獲取數據庫文件的存放路徑。687.6.3MySQL數據庫的連接StringdriverClass="com.mysql.jdbc.Driver";MySQL數據庫的驅動為:
連接MySQL數據庫需要用到的包為mysql-connector-java-3.0.16-ga-bin.jar。連接MySQL數據庫的URL為:Stringurl="jdbc:mysql://:3306/db_database08";7.7數據庫操作技術6970
在開發Web應用程序時,經常需要對數據庫進行操作,最常用的數據庫操作技術,包括向數據庫查詢、添加、修改或刪除數據庫中的數據,這些操作即可以通過靜態的SQL語句實現,也可以通過動態的SQL語句實現,還可以通過存儲過程實現,具體采用的實現方式要根據實際情況而定。7.7數據庫操作技術
查詢操作添加操作修改操作刪除操作71JDBC中提供了兩種實現數據查詢的方法,一種是通過Statement對象執行靜態的SQL語句實現;另一種是通過PreparedStatement對象執行動態的SQL語句實現。由于PreparedStatement類是Statement類的擴展,一個PreparedStatement對象包含一個預編譯的SQL語句,該SQL語句可能包含一個或多個參數,這樣應用程序可以動態地為其賦值,所以PreparedStatement對象執行的速度比Statement對象快。因此在執行較多的SQL語句時,建議使用PreparedStatement對象。7.7.1查詢操作72try{Statementsql=con.createStatement();ResultSetrs=sql.executeQuery(“SELECT*FROM表名”);}catch(SQLExceptione){System.out.println(e);}try{PrepareStatementsql=con.prepareStatement(“SELECT*FROM表名”);ResultSetrs=sql.executeQuery();}catch(SQLExceptione){System.out.println(e);}73
通過Statement對象和PreparedStatement對象實現數據添加操作的方法同實現查詢操作的方法基本相同,所不同的就是執行的SQL語句及執行方法不同,實現數據添加操作時采用的是executeUpdate()方法,而實現數據查詢時使用的是executeQuery()方法。實現數據添加操作使用的SQL語句為INSERT語句,其語法格式如下:Insert[INTO]table_name[(column_list)]values(data_values)JDBC中也提供了兩種實現數據添加操作的方法,一種是通過Statement對象執行靜態的SQL語句實現;另一種是通過PreparedStatement對象執行動態的SQL語句實現。7.7.2添加操作74參數描述[INTO]可選項,無特殊含義,可以將它用在INSERT和目標表之前table_name要添加記錄的數據表名稱column_list是表中的字段列表,表示向表中哪些字段插入數據;如果是多個字段,字段之間用逗號分隔;不指定column_list,默認向數據表中所有字段插入數據data_values要添加的數據列表,各個數據之間使用逗號分隔;數據列表中的個數、數據類型必須和字段列表中的字段個數、數據類型相一致values引入要插入的數據值的列表;對于column_list(如果已指定)中或者表中的每個列,都必須有一個數據值;必須用圓括號將值列表括起來;如果VALUES列表中的值與表中的值和表中列的順序不相同,或者未包含表中所有列的值,那么必須使用column_list明確地指定存儲每個傳入值的列75Statementstmt=conn.createStatement();intrtn=stmt.executeUpdate("insertintotb_user(name,pwd)values('hope','111')");
應用Statement對象向數據表tb_user中添加數據的關鍵代碼如下:
利用PreparedStatement對象向數據表tb_user中添加數據的關鍵代碼如下:PreparedStatementpStmt=conn.prepareStatement("insertintotb_user(name,pwd)values(?,?)");pStmt.setString(1,"dream");pStmt.setString(2,"111");intrtn=pStmt.executeUpdate();76JDBC中也提供了兩種實現數據修改操作的方法,一種是通過Statement對象執行靜態的SQL語句實現;另一種是通過PreparedStatement對象執行動態的SQL語句實現。通過Statement對象和PreparedStatement對象實現數據修改操作的方法同實現添加操作的方法基本相同,所不同的就是執行的SQL語句不同。7.7.3修改操作77
實現數據修改操作使用的SQL語句為UPDATE語句,其語法格式如下:UPDATEtable_nameSET<column_name>=<expression>[….,<lastcolumn_name>=<lastexpression>][WHERE<search_condition>]78參數描述table_name需要更新的數據表名SET指定要更新的列或變量名稱的列表column_name含有要更改數據的列的名稱;column_name必須駐留于UPDATE子句中所指定的表或視圖中;標識列不能進行更新;如果指定了限定的列名稱,限定符必須同UPDATE子句中的表或視圖的名稱相匹配expression變量、字面值、表達式或加上括號返回單個值的subSELECT語句;expression返回的值將替換column_name中的現有值WHERE指定條件來限定所更新的行<search_condition>為要更新行指定需滿足的條件,搜索條件也可以是連接所基于的條件,對搜索條件中可以包含的謂詞數量沒有限制79Statementstmt=conn.createStatement();intrtn=stmt.executeUpdate("updatetb_usersetname='hope',pwd='222'wherename='dream'");
應用Statement對象修改數據表tb_user中name字段值為“dream”的記錄,關鍵代碼如下:
利用PreparedStatement對象修改數據表tb_user中name字段值為“hope”的記錄,關鍵代碼如下:80說明:在實際應用中,經常是先將要修改的數據查詢出來并顯示到相應的表單中,然后將表單提交到相應處理頁,在處理頁中獲取要修改的數據,并執行修改操作,完成數據修改。PreparedStatementpStmt=conn.prepareStatement("updatetb_usersetname=?,pwd=?wherename=?"); pStmt.setString(1,"dream"); pStmt.setString(2,"111"); pStmt.setString(3,"hope"); intrtn=pStmt.executeUpdate();81
實現數據刪除操作也可以通過兩種方法實現,一種是通過Statement對象執行靜態的SQL語句實現;另一種是通過PreparedStatement對象執行動態的SQL語句實現。通過Statement對象和PreparedStatement對象實現數據刪除操作的方法同實現添加操作的方法基本相同,所不同的就是執行的SQL語句不同。實現數據刪除操作使用的SQL語句為DELETE語句,其語法格式如下:DELETEFROM<table_name>[WHERE<searchcondition>]7.7.4刪除操作82Statementstmt=conn.createStatement();intrtn=stmt.executeUpdate("deletetb_userwherename='hope'");
應用Statement對象從數據表tb_user中刪除name字段值為“hope”的數據,關鍵代碼如下:
利用PreparedStatement對象從數據表tb_user中刪除name字段值為“dream”的數據,關鍵代碼為:PreparedStatementpStmt=conn.prepareStatement("deletefromtb_userwherename=?");pStmt.setString(1,"dream");intrtn=pStmt.executeUpdate();7.8連接池技術83847.8連接池技術
連接池簡介在Tomcat中配置連接池使用連接池技術訪問數據庫7.8.1連接池簡介
所謂連接池,就是預先建立好一定數量的數據庫連接,模擬存放在一個連接池中,由連接池負責對這些數據庫連接進行管理。85
這樣,就免去了每次在訪問數據庫之前建立數據庫連接的開銷。
連接池還解決了數據庫連接數量限制的問題。由于數據庫能夠承受的連接數量是有限的,當達到一定程度時,數據庫的性能就會下降,甚至崩潰,而池化管理機制,通過有效地使用和調度這些連接池中的連接,則解決了這個問題。數據庫連接池的具體實施辦法是:
預先創建一定數量的連接,存放在連接池中;當程序請求一個連接時,連接池是為該請求分配一個空閑連接,而不是去重新建立一個連接;當程序使用完連接后,該連接將重新回到連接池中,而不是直接將連接釋放;當連接池中的空閑連接數量低于下限時,連接池將根據管理機制追加創建一定數量的連接;當空閑連接數量高于上限時,連接池將釋放一定數量的連接。87
在每次用完Connection后,要及時調用Connection對象的close()或dispose()方法顯式關閉連接,以便連接可以及時返回到連接池中,非顯式關閉的連接可能不會添加或返回到池中。連接池具有下列優點:
創建一個新的數據庫連接所耗費的時間主要取決于網絡的速度以及應用程序和數據庫服務器的(網絡)距離,而且這個過程通常是一個很耗時的過程,而采用數據庫連接池后,數據庫連接請求則可以直接通過連接池滿足,而不需要為該請求重新連接、認證到數據庫服務器,從而節省了時間;
提高了數據庫連接的重復使用率;
解決了數據庫對連接數量的限制。
連接池中可能存在多個與數據庫保持連接但未被使用的連接,在一定程度上浪費了資源;
要求開發人員和使用者準確估算系統需要提供的最大數據庫連接的數量。連接池具有下列缺點:
為了使用連接池技術訪問數據庫,首先要建立數據源配置,下面介紹MySQL數據源的基本配置。(1)啟動To
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學校生物園管理制度
- 學校詩詞曲管理制度
- 學法校資產管理制度
- 學生穿校服管理制度
- 安全生產部管理制度
- 安裝隊科室管理制度
- 定銷房銷售管理制度
- 實訓室環境管理制度
- 審核制度及管理制度
- 客棧經營與管理制度
- 2025年中科院心理咨詢師培訓考試復習題庫-上(單選題)
- 危化三級安全教育
- 馬克思主義基本原理與科技創新的結合心得體會
- 美發店投資入股協議書8篇
- 第四單元 課題3 物質組成的表示教學設計-2024-2025學年九年級化學人教版(2024)上冊
- 植物細胞的分子生物學研究-深度研究
- DeepSeek零基礎到精通手冊(保姆級教程)
- 2024年中國軟件行業基準數據 (CSBMK-202410)
- 小學四年級下冊四則混合運算及簡便運算
- 公共政策分析概論 課件 第3章 政策主體、政策客體與政策環境
- 《學前教育教育研習》課程教學大綱
評論
0/150
提交評論